2011-08-01 16 views
8

JPanelにはpaintComponent()の機能があります。私はそれを一度呼び出すと、別のJButtonをクリックするとフラグがいくつか設定され、フラグが設定された後に少し違うことになるので、この関数を再度呼び出すことにします。JPanelグラフィックスのクリアと再ペイント?

ここに私が思っているのは、どうすれば既存のものをpaintComponentからクリアするのですか?再描画するには、paintComponentに再度電話するだけですか?

現在、私は次のことをしようとしている:塗料・コンポーネントで

flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

、私は次のようなものを行う:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

しかし、私は何に問題があるようにテストされて、それはそうですやって

ありがとうございました。

+0

paintComponentメソッド内からrepaint()を呼び出すのではないですか? repaint()コールがリフレッシュするパネルに関連付けられていることを確認してください。 (例:myPanel.repaint())? –

答えて

14

あなたはパネルのプロパティを変更すると、あなたが呼び出す必要があります。

はその後paintComponent()メソッドの最初のステートメントは次のようになります。あなたは今、あなたのカスタムペイントを行うことができますので、

super.paintComponent(g); 

これは、バックグラウンドをペイントします。

さらにヘルプが必要な場合は、問題を示すSSCCEを投稿してください。

2

まず、ブール値の代わりに列挙型を使用してみましょう。

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

あなたの問題に関しては、あなたの質問に私のコメントに答えることができますか?

+0

私が持っているロジックはうまくいきますが、おそらくenumを使用できますが、それは私の問題ではありません。私の問題は、描画されたすべてのグラフィックスをクリアしてからpaintManagerをもう一度このJPanelのために呼び出す必要があることです。 – JDS

+0

あなたが望むものを得るために、すべてのグラフィックスをクリアする必要はありません。 –

+0

camickrの答えを参照してください。彼が概説したことをやっていないのであれば、まずそれに焦点を当ててください。 –

13

以前に描画されたすべてのグラフィックを消去するには、g.clearRect(0, 0, getWidth(), getHeight())を呼び出します。

panel.repaint(); 

をコンポーネントが再描画させるように:

2

私はrevalidate()を呼び出すことをお勧めします。 repaint()の代わりに。サイズ/レイアウトを変更するときや、jpanelにオブジェクトを追加/削除するときにrevalidate()を呼び出す必要があり、そのすべての子を更新します。私が言うことから、あなたはまだ同じ塗料オブジェクトを使用していますが、レイアウトを変更しています。

関連する問題