2010-12-31 15 views
3

JScrollPane内のJPanelを再ペイントする際に問題があります。JScrollPane内のJPanelを再ペイントするときのちらつき

基本的に、私はちょうどJScrollPaneに私の既存のEditPanel(元々はJPanelを拡張しました)を 'ラップしようとしています。

JPanelが頻繁に更新されるようです(大量点滅)。私はこれをどうやって止めますか?私はsetIgnoreRepaint()を使ってみましたが、何もしていないようです。

グラフィックスを表示するために使用しているJPanelを微調整するために、この現在の実装が機能するか、別の内部クラスを作成する必要がありますか?

スケルトンコード:

public class MyProgram extends JFrame{ 

    public MyProgram(){ 
     super(); 
     add(new EditPanel()); 
     pack(); 
    } 
    private class EditPanel extends JScrollPane{ 

     private JPanel graphicsPanel; 

     public EditPanel(){ 
      ///EDIT, sorry, should have mentioned this was here before 
      super(); 
      graphicsPanel = new JPanel(); 
      this.setViewportView(graphicsPanel); 
      //END EDIT 
     } 

     public void paintComponent(Graphics g){ 
      graphicsPanel.revalidate(); //update the scrollpane to current panel size 
      repaint(); 

      Graphics g2 = graphicsPanel.getGraphics(); 
      g2.drawImage(imageToDraw, 0, 0, null); 
     } 
    } 
} 

答えて

3

。無限の再描画ループが発生しています。

JScrollPaneをまったく拡張する必要はありません。コンポーネントを追加するためだけにクラスを拡張するべきではありません。これがsetViewportView(...)メソッドの目的です。

カスタムペイントを行っている場合、JPanelを拡張してパネルのpaintComponent()メソッドをオーバーライドします。

次に、パネルを再描画することにした場合は、単にパネル。repaint()を呼び出します。

+0

なぜそれが機能していなかったのかを説明してくれてありがとう。 EditPanelは最初はJFrameを拡張していましたが、複数のインスタンスを作成していて、それぞれがJScrollPaneにあったので、JScrollPaneをオブジェクトに統合するのがよりコンパクトになると思いました。私はJFrameを拡張することに戻ります。 – pR0Ps

0

あなたがスクロール可能な領域に実装しようとしている場合、私はJScrollPaneをサブクラス化し、paintComponent()が問題を引き起こしている可能性がありますオーバーライド疑い。ただ、私はあなたがためにあなたができるスクロールペインに何かを追加することを知っていると仮定し、チェックします

Scrollpane.getViewPort().add(JComponent); 

ない場合は、JScrollPanehow to useするJScrollPaneのを見てみましょう。以前は誰もJScrollPaneをサブクラス化していなかった。

私はもちろん間違っている可能性があります。私はすぐに見つかるだろう。

私は個人的には物事が複雑になっても、いつでも "大量にちらつき"が発生した場合には、少しでもスイングが遅くなることがわかります。

1

Hmm。なぜJScrollPaneをサブクラス化するのですか?私はこれをやっていたならば、私は、サブクラスJPanelのかJTableのどちらかだろう、とJScrollPaneの中で私のクラスをラップ:塗装メソッド内)((再検証を呼び出していない)、または再描画NEVER

JTable table = new MySpecialJTable(); 
JScrollPane scrollPane = new JScrollPane(table); 
Component container = /* scrollPane goes in here, set the size of scrollPane 
     yourself or let a layout manager do that for you */ 
container.add(scrollPane); 
関連する問題