4

//初心者の質問

ほとんど基本的なセルレンダラーを備えた JTable があります (線の色が異なります)。テーブルで何もしていない場合でも、画面に表示される行に対してセル レンダラーが常に実行されていることに気付きました。

それが本来あるべき姿ですか?各セルを一度レンダリングするべきではありませんでしたか? どうすれば停止し、変更時にのみ再計算できますか?

public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {

   log.debug("Building cell : " + row + "," + column);

   Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

   Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION.getIndex());
   comp.setBackground(filter.getColor());
   return comp;

  }
4

4 に答える 4

3

@Steve McLeod のオファーに従って、同じバグのサンプル コードの作成を開始しました。

@Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        log.debug("Building a list for " + row + "," + column);
        setListData(((Vector<String>)value).toArray());     
        setToolTipText("This is a tool tip for " + row + "," + column);

        table.setRowHeight(row, Math.max(1, getPreferredSize().height));
        Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION_RESULT.getIndex());
        setBackground(filter.getColor());       
        return this;
    }

私は次の行を持っていました:

table.setRowHeight(row, Math.max(1, getPreferredSize().height));

同じ行の他のレンダラーが同じことをしている間、それは絶えず行ラインを変更しました...したがって、それらは常に互いに発火していました。

于 2010-12-29T11:27:38.943 に答える
2

私は多くのデータを含むJTablesで多くの作業をしました。Javaプログラマーの99.9%が通常操作するものよりも多く。知っておく必要のあることが1つあります。デフォルトでは、非常に多くの廃棄物が生成され、通常は非常に多くの不要な操作が実行されます。

高速で効率的なJTableをお探しの場合は、このテーマに関する信頼できるSunの記事があります。

「クリスマスツリーアプリケーション、パフォーマンスの高い頻繁に更新されるJTableを作成する方法」

デフォルトでは、JTableのパフォーマンスは本当に、本当に悲惨なほど悪いので、タイトルのパフォーマンスが良い」ことに注意してください。

オリジナルリンク(日)

現在のリンク(Oracle)

アーカイブ版:

その記事でアドバイスされている2つまたは3つの手法を実装すると、JTableレンダリングが驚くほど高速化され、生成されるガベージが大幅に少なくなることがわかります(したがって、GCの起動頻度が低くなります)。

于 2010-12-27T15:04:19.303 に答える
1

別のセルの値に基づいてセルの外観を変更していることに気付きました。この関係が双方向の場合 (セル 1 の外観がセル 2 に基づいており、その逆の場合)、このような問題が発生する可能性があります。しかし実際には、問題を再現する自己完結型のコード例が必要です。そうしないと、暗闇でしか撮影できません。

于 2010-12-27T17:18:18.170 に答える
0

レンダラーは、レンダリングされたコンポーネントを既にキャッシュしています。何も変更されず、何も再レンダリングされない場合

ただし、テーブルが何かが変更された可能性があることを検出すると、再レンダリングが要求されます。最もトリガーされるイベントは、マウスの移動です。

はい、JTable の通常の動作です。

于 2010-12-27T13:25:17.430 に答える