TableCellRendererを実装するカスタムセルレンダラーを使用していて、各行にJTextArea(JLabelではなく)を表示しています。私は基本的に行ごとにいくつかの追加の計算を行う私のgetTableCellRendererComponent(...)メソッドをオーバーライドしています。これらの計算は、テーブル更新ごとに1回だけ実行する必要があります。マウス移動ごとにgetTableCellRendererComponentメソッドが呼び出されているので、ラグが発生します。だから私は、遅れを避けるためにgetTableCellRendererComponentを呼び出さないようにすべきだと思った。getTableCellRendererComponent呼び出しの数を減らす
考察:
1)私のテーブルが1つだけの列を有し、全くヘッダを有していません。
2)私のデータは静的で、AbstractTableModelを実装しているカスタムテーブルモデルクラスのgetValueAt(int row、int column)メソッドによってArrayListから読み込まれます。
3)マウスの動きイベントを監視する必要はありません。
4)私は多くのデータを期待していないので、テーブル全体を一度に表示したり、完全にキャッシュしたりしたいと思うかもしれません。
5)ほとんどのラグは、getTableCellRendererComponentから返されるたびにテキストを設定することによって発生します。一部の行で右から左への文字が使用され、RTLテキストでレンダリングに余分な時間がかかるためです。
@Robinの答えを強調するために:決してgetXXRendererComponentで_any_計算を行うことはありません。通話の頻度は高く、コントロールから完全に外れています。 – kleopatra
@kleopatra kがそれを手に入れました。しかし、私は内部の操作をどのように制御するのですか? setTextメソッドやsetFontメソッドと同様に、getCellRendererComponentメソッド内で(私のJTextAreaセルに対して)使用します。 –
_renderer_を設定するのはきれいです。私はあなたが実際に "計算"を意味するものと誤解しているように思えます。 SSCEEの時間(または少なくともレンダラーのコード:-) – kleopatra