5

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

考慮事項:

1) 私のテーブルには 1 列しかなく、ヘッダーがありません。

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

3) マウス モーション イベントを監視する必要はありません。

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

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

4

1 に答える 1

7

getTableCellRendererComponent呼び出し回数を制限しようとしないでください。代わりに、計算結果をキャッシュして、レンダラーの実装を改善してください。

モデルがいつ更新されるかをレンダラーが認識できるように、テーブルモデルにリスナーを簡単に追加できます。その場合にのみ、保存された計算結果が無効であることをマークし、次のgetTableCellRendererComponent呼び出しでそれらを再計算する必要があります。

于 2012-08-28T05:58:56.293 に答える