2012-08-28 2 views
5

TableCellRendererを実装するカスタムセルレンダラーを使用していて、各行にJTextArea(JLabelではなく)を表示しています。私は基本的に行ごとにいくつかの追加の計算を行う私のgetTableCellRendererComponent(...)メソッドをオーバーライドしています。これらの計算は、テーブル更新ごとに1回だけ実行する必要があります。マウス移動ごとにgetTableCellRendererComponentメソッドが呼び出されているので、ラグが発生します。だから私は、遅れを避けるためにgetTableCellRendererComponentを呼び出さないようにすべきだと思った。getTableCellRendererComponent呼び出しの数を減らす

考察:

1)私のテーブルが1つだけの列を有し、全くヘッダを有していません。

2)私のデータは静的で、AbstractTableModelを実装しているカスタムテーブルモデルクラスのgetValueAt(int row、int column)メソッドによってArrayListから読み込まれます。

3)マウスの動きイベントを監視する必要はありません。

4)私は多くのデータを期待していないので、テーブル全体を一度に表示したり、完全にキャッシュしたりしたいと思うかもしれません。

5)ほとんどのラグは、getTableCellRendererComponentから返されるたびにテキストを設定することによって発生します。一部の行で右から左への文字が使用され、RTLテキストでレンダリングに余分な時間がかかるためです。

+1

@Robinの答えを強調するために:決してgetXXRendererComponentで_any_計算を行うことはありません。通話の頻度は高く、コントロールから完全に外れています。 – kleopatra

+0

@kleopatra kがそれを手に入れました。しかし、私は内部の操作をどのように制御するのですか? setTextメソッドやsetFontメソッドと同様に、getCellRendererComponentメソッド内で(私のJTextAreaセルに対して)使用します。 –

+0

_renderer_を設定するのはきれいです。私はあなたが実際に "計算"を意味するものと誤解しているように思えます。 SSCEEの時間(または少なくともレンダラーのコード:-) – kleopatra

答えて

7

getTableCellRendererComponentコールの数を制限しないでください。その代わりに、計算結果をキャッシュすることでレンダラの実装を改善してください。

モデルが更新されたときにレンダラーが認識できるように、リスナーをテーブルモデルに簡単に追加できます。そのときだけ、格納された計算結果が無効であることをマークし、次のgetTableCellRendererComponentコールでそれらを再計算しなければなりません。

関連する問題