web-dev-qa-db-ja.com

JPanel Graphicsのクリアと再描画?

paintComponent()関数を持つJPanelがあります。一度呼び出してから、ユーザーが別のJButtonをクリックすると、フラグを設定します。フラグが設定された後は少し異なる動作をするため、この関数をもう一度呼び出します。

だから私が疑問に思っているのは次のとおりです:paintComponentから既存のものをクリアするにはどうすればよいですか?そして、再描画するには、もう一度paintComponentを呼び出しますか?

現在、私は以下を試しています:

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

ペイントコンポーネントでは、次のようなことを行います。

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

しかし、テストを通して、私がしていることに何か問題があるようです。

助けてくれてありがとう。

8
JDS

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

panel.repaint();

コンポーネントを再ペイントします。

次に、paintComponent()メソッドの最初のステートメントは次のようになります。

super.paintComponent(g);

これにより背景がペイントされるので、カスタムペイントを実行できます。

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

15
camickr

まず、ブール値の代わりに列挙型を使用してみませんか?

enum Enum { 
    RECTANGLE,
    LINE,
    CIRCLE
}

Enum choice = RECTANGLE; //default to RECTANGLE

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

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

2
Amir Afghani

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

2
John Snow