1

表示用に生成しているレポートの一部を強調したいと思います。
レポート定義を変更したくありません。実行時に出力を強調表示したい。

しかし、私が使用している JRViewer には実際には多くの API がありません。
JasperPrint オブジェクトを表示する前に setForecolor/setBackcolor で操作しても、出力は変わらないようでした。

何か案は?または、ビューアをオーバーロード/再実装する必要がありますか? オープンソースなので大した問題にはなりませんが、車輪の再発明は避けたいです。

4

1 に答える 1

0

自分で質問に答えなければならないようです...もう一度。

私はJRViewerクラスをオーバーロードし(興味深いパネルにアクセスできなかったため、実際にはJRViewerのコードをコピーしました)、次のことを行うためにいくつかの強調表示メソッドを追加しました。

テンプレートベースのJasperPrintデータは、名前が示すように、テンプレートを使用します。つまり、テキストオブジェクトには独自のスタイルがなく、テンプレートのスタイルを使用します。
これが、setForecolorが何もしなかった理由です。JRTemplatePrintElementの実装はまったく空です。

ただし、テキストテンプレートにハイライトを設定すると、テンプレートインスタンスを共有するため、ハイライトされたテキストの列全体が表示されます。
代わりに、ハイライトされたオリジナルのコピーとして新しいテンプレートを作成し、ハイライトされた印刷要素でそれを使用します。ところで、これらのジャスパー要素は実際にclone()メソッドを使用できます。
ハックのように感じますが、私にはもっと良い方法がありません。

更新:
ただし、これにはファイルベースの(仮想化された)レポートには厄介な副作用があります。これらは、ページを歩きながら要素に加えた変更を保存しているようです。ただし、その間にビューアによって、参照した要素が仮想化機能によって破棄された場合(たとえば、ページをめくるなど)、それ以上の変更は保存されません...

そのため、私は再考しました。今は、JasperのPageRendererによってペイントされたGraphicsオブジェクトの上にハイライトを描画しています。
はるかにシンプルでクリーン。背景を強調表示するだけでは、このようには機能しません。

于 2009-04-14T10:03:55.513 に答える