2012-03-19 7 views
0

ハイパーエキスパート:JPanelを拡張するクラスがあります。ShapePanel(Sp)これは、inturnがJFrame(Window)に追加される通常のJPanel(Container)に追加されます。 paintComponentメソッドでは、私は図形を描く....しかし、図形はレンダリング後には決して残らない。デバッガでは、私はサイズ変更するたびに再描画されるか、そのようなことがわかります。JPanelで描画オブジェクトを永続化する

今私は(SPの)paintComponentのJPanelの過負荷とグラフィックオブジェクトは(当然)から来ているこの

super.paintComponent(g);   

    ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics()); 
    //for(Shape s : ArrayOfShapes) 
    { 
     if(s instanceof Rectangle) 
       SdG.Paint((Rectangle)s); 
      else if(s instanceof Triangle) 
       SdG.Paint((Triangle)s); 
      else 
       SdG.Paint((Circle)s); 
    } //s is a custom-shape object 

を追加したJPanel ....

しかし、描画された画像は、パネルの上にとどまることはありません - あなたはそれが分けられて、それが消えたのを見ます...

私はいくつかの検索をしましたが、無駄です。

実際の描画

public ShapeDrawerGui(Graphics2D _g) 
{ 
    g = _g; 
    g.setColor(Color.Black); 
} 

@Override 
public void Paint(Circle c) 
{ 
    g.drawArc(0, 0, 50, 50, 0, 360); 
} 

@Override 
public void Paint(Triangle t) 
{   
    Polygon p = new Polygon(); 
    p.addPoint(0, 25); 
    p.addPoint(0 , 50); 
    p.addPoint(50, 50);  
    g.drawPolygon(p); 
} 

@Override 
public void Paint(Rectangle r) 
{ 
    g.drawRect(0, 0, 50, 50); 
} 

種類

に関してマーカス

+0

あなたは 'Paint()'メソッドを大文字のP - ouch ..としていますが、これは問題ではありません。 –

+0

あなたは 'ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());'を 'ShapeDrawerGui SdG =新しいShapeDrawerGui((Graphics2D)g);' –

+1

* "に変更しようとしましたか? JPanel "* [SSCCE](http://sscce.org/)は、通常、事柄を明白にします。 –

答えて

2

..whatはthis.getGraphicsとgとの間の差でありますか..?

A GUIは、そうするように言われたときに再描画、およびpaint(Graphics)またはpaintComponent(Graphics)方法に供給されるGraphicsオブジェクトを使用する必要があります。このメソッドは、GUIによっていつでも呼び出すことができ、たとえば別のウィンドウの後に再描画することができます。

getGraphics()に電話すると、次のペイントが消える非永続グラフィックスオブジェクトが提供されます。

super.paintComponent(g);   

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics()); 

gSdGは、2つの異なるオブジェクトで、反直感的に、自分の専門のパネルに属しgは、常にそれに描画されるものではありません。

+0

+1私はそれを見落とした。 @Markus:バインドされていないプロパティを変更する場合は、 'repaint()'も呼び出さなければならないかもしれません。 – trashgod

1

は、ここで問題です。

あなたのプログラムが何をしているかによって、彼らはキャンバスに描画することができますが、gは常に最後に描画され、SgDがペイントされた後も持続します。 Graphics2DSgD DOESは、ペイントしたいコンポーネントに属していますが(getGraphics())、キャンバスのペイントに使用されるグラフィックスであるとは限りません。

私はこれが直感的ではないことを知っています。各jJXXXには関連付けられたGraphicsオブジェクトがあり、描画に使用されますが、スウィングが描画に使用することを意味するものではありません。

paintComponentのパラメータで表示されるグラフィックスは、getGraphics()のグラフィックと同じではありません。paintComponent()は、getGraphicsを呼び出すのと同じオブジェクトのメソッドです。

あなたがこれを見たい場合は、単にpaintComponent(Graphics g)でこの文の最初の行にブール値を設定:

boolean sameObject = (g== getGraphics()) 

sameObjectをプリントアウトします。単語falseが表示されます。

したがって、どちらも画面に描画するために使用されています。その時、あなたのキャンバスのgが絵を描いているからです。その後、マイクロ秒後にパラメータとして受け取っているgが図面を実行しており、最後に描画されます。

最後に勝つものが勝ちます。それは逆のショーダウンのようなものです。

関連する問題