9

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

だからここに私が疑問に思っていることがあります:既存のものをどのようにクリアするのpaintComponentですか?そして、再描画するために、paintComponentもう一度電話しますか?

現在、私は次のことを試みています:

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

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

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

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

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

4

4 に答える 4

15

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

panel.repaint();

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

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

super.paintComponent(g);

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

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

于 2011-08-01T19:01:33.860 に答える
14

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

于 2011-08-01T18:58:46.323 に答える
2

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

enum Enum { 
    RECTANGLE,
    LINE,
    CIRCLE
}

Enum choice = RECTANGLE; //default to RECTANGLE

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

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

于 2011-08-01T18:46:02.270 に答える
2

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

于 2011-08-01T20:40:52.510 に答える