2011-12-24 10 views
3

私は簡単なペイントプログラムを書いています。 私はJPanelを作成しており、 "public void paintComponent(Graphics g)"と書かれており、適切なListenersも作成しました。問題は、私が新しい形を描くたびに、前の形が消えてしまうことです。以前の形をどのように保持できるのか誰にも分かりますか?私はsuper.paintComponent(g)を持ち去ることができますが、Jpanel'slayoutは歪んでしまいます。 どのような提案も高く評価されています。 :) これは私のpaintComponentメソッドです:paintComponentは以前塗装されたコンポーネントを削除します

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 


    int width = xend-xstart; 
    int height = yend - ystart; 
    if(width<0) 
     width *= -1; 
    if(height <0) 
     height *= -1; 
    if(color!= null && shape !=null){ 
    if(fill.isSelected()) 
    { 
     g.setColor(color); 
     if(shape.equals("Rectangle")) 
      g.fillRect(xstart, ystart, width, height); 
     if(shape.equals("Square")) 
      g.fillRect(xstart, ystart, width, width); 
     if(shape.equals("Circle")) 
      g.fillOval(xstart,ystart,width ,width); 

    } 
    } 

} 
+0

@ Andrew Thompsonありがとうございましたが、これがより多くの形を描くので、これは効率に影響しませんでしたか?なぜなら、paintComponentはrepaint()を呼び出すたびに多くのシェイプを描画する必要があるからです。 – BBB

+2

ありがとうございます、あなたもそうです:)また、元に戻す機能を書く必要があります。リストもその場合に役立ちます:)助けてくれてありがとう – BBB

答えて

4

複数を描画する「四角形」、「スクエア」や「サークル」のオブジェクトは、コレクション(例えばArrayList‌)との各呼び出しにそれらを追加する必要がありますpaintComponent(Graphics)、コレクションを繰り返し、それぞれを描画します。

いずれか、図形をBufferedImageに描画し、代わりに画像を描画します。

..これは、より多くの形を描画するので、効率に影響しませんか?なぜなら、paintComponentはrepaint()を呼び出すたびに多くのシェイプを描画する必要があるからです。

3つの回答があります。ここにあります:

  1. はいそうです。
  2. しかし、いいえ、表示されるスローダウンを引き起こす前に、にする必要があります。
  3. パフォーマンスに問題がある場合。 BufferedImageを使用します。このようにして、新しく追加された各シェイプの画像には、もう1つのシェイプだけが描画されます。...百万円がレンダリングされています。

私はアンドゥ機能とリストを記述する必要が..alsoその場合に有用であろうあまりに

リストは、このユースケースのために進むべき道であるようにそれは聞こえるん。

+2

答えはコメント+1よりも良いです。 – mKorbel

+0

@mKorbel私の答え: - 段落、引用された資料、注文リスト、600文字以上。少なくとも彼らはコメントを超えて進化しました。 ;) –

0

Andrew Thompsonの答えは、あなたが望むことを行うための「典型的な」方法です。しかし、スイングの深さをさらに深く掘り下げたい場合は...

super.paintComponent()が行うことの1つはJComponent.paintComponent()ComponentUI.update())です。

"デフォルトでは、このメソッドは指定されたコンポーネントをその背景色(、その不透明なプロパティがtrueの場合)に塗りつぶしてすぐにペイントを呼び出します。

だから、setOpaque(false)を呼び出してみてください。しかし、多くの場合、あなたが実際にのような他の問題につながる、の前に描かれたものを消したい。

関連する問題