2011-01-04 9 views
0

私はスイングアプリを持っています。大きなJTableを含むたくさんの内部フレームを持つjframeがあります。 これらのjtableは継続的に更新され、何度も再ペイントが行われます。不可視のJFrame/JTableはどれくらい速いですか?

状況によっては、単にJFrameを見えないようにすることができます。私は、パフォーマンスの面で何かを獲得するならば誰もが知っている場合(frame.setVisibleは(偽))

私は、このような50%のゲインとして(かなりか何か)

を思っていたか、あなたはわずか2%になるだろうゲイン...

と多分何を期待しているかについての説明。

ありがとう

p.s. 質問を言い換えるもう1つの方法は次のとおりです。 スイングのコンポーネントは、表示されていない場合に再塗りつぶし/リフローできないほど巧妙ですか?

+0

テーブルの新しいレコードを追加するとすぐにユーザーに表示する必要がありますか? – Cratylus

+0

いいえ、私はしません。状況によっては、1〜2時間それを見えなくすることができてうれしいです... – chacko

+0

テーブルモデルを更新する代わりに、レコードをキューに入れることができます。その後、例えばx秒または分の間隔で、すべての待ち行列の情報でテーブルモデルを更新することができます。メモとして、再ペイントによるパフォーマンスの問題があるかどうかはわかりません。同じコンポーネントに対する一連の再描画要求がある場合は、最後の要求であるSwingによって1が実行されます。 – Cratylus

答えて

0

あなたのJTableはJScrollPaneのであれば、各ラインADITIONで再描画(とモデルのfireTableRowsInsertedに呼び出す)になるようです。したがって、スクロールペインはscollbarsを更新し、次にそのコンポーネント(JTable)を更新するためです。テーブルがスクロールペインにない場合は、表示されている行のみを再描画します。したがって、あなたの行が表示されていない場合は、再塗装をトリガーしません... Stupide。私はこれを避ける方法を探しています。

+0

方法が見つかりません。私は、挿入をキューに入れ、リフレッシュスレッドを持つという解決策が最善の方法だと思います。 – Twister

1

JTableを表示していない間に一時的にJTableからTableModelを切断する必要があると思います。

あなたが直面している最大の問題は、JTableがモデル変更イベントに反応し、それ自体を継続的に再描画することです。

JTableは見えません(ただし、モデルの変更を持っている)が、私はこれで私のお金を入れていないだろうが、それ自体を再描画しないように十分にインテリジェントであることも可能です。

+0

本当に質問です... jtableは目立たない場合には、例を提供するためには – chacko

1

この問題を解決する最良の方法は、両方をテストすることです。両方のオプションをプロファイルしても利得がないと見れば、solaのような別のルートを試してみることをお勧めします。アプリケーションの間違った部分を最適化していないことを確認してください。

1

パフォーマンスの向上の程度を数値で示すことはできませんが、これはあまりにも多くの要素に依存し、独自のプロファイリングに任せておくことをお勧めします。しかし、コンポーネントが表示されていない場合、paintComponent()(またはrepaint())メソッドは私が知る限り呼び出されません。

3

Swing Painting Guidelinesをご覧ください。絵画の効率についてのヒントがいくつかあります。例えば:複合出力、 再描画(持つコンポーネントに

は)むしろ コンポーネント全体を引き起こす引数なしのバージョンよりも、更新する必要があるだけ 矩形を定義 引数で呼び出されるべきです再描画される。複雑な出力 をレンダリング

コンポーネントは、クリップ領域と を交差するものに描画 操作を狭めるためのクリップ 長方形のスマートな使用をしなければなりません。

また、目に見えないコンポーネントが塗られていないことを証明することも非常に簡単です。次のコードはパネルを隠し、paintが呼び出された場合に出力します。

public static void main(String args[]) throws Exception { 
    JFrame f = new JFrame(); 
    final JPanel p = new JPanel(){ 
     public void paint(Graphics g){ 
      super.paint(g); 
      System.out.println("IN PAINT"); 
      g.fillRect(10, 10, 20, 20); 
     } 
    }; 
    f.setLayout(new BorderLayout()); 
    f.add(p, BorderLayout.CENTER); 

    JButton b = new JButton("OK"); 
    b.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("PRESSED"); 
      p.setVisible(!p.isVisible()); 
     } 
    }); 
    f.add(b, BorderLayout.SOUTH); 
    f.setSize(100,100); 
    f.setVisible(true); 
} 
+0

+1。私はデバッガを使ってステップアップすることを提案してきましたが、これはコピーアンドペーストのトリックです。 –

関連する問題