2

Java 開発者の皆様、こんにちは。

これまで、このシナリオに遭遇したことはありません。このシナリオは次 のとおりです



Box.pngCircle.png

private final URL IMG1_DIRECTORY = Main.class.getResource("/res/Box.png");
private final URL IMG2_DIRECTORY = Main.class.getResource("/res/Circle.png");

コンストラクターの下で:

try {
    box = ImageIO.read(IMG1_DIRECTORY);
} catch (Exception e) {
    // Our catchblock here
}

try {
    circle= ImageIO.read(IMG2_DIRECTORY);
} catch (Exception e) {
    // Our catchblock here
}

currentImg = box;

メソッドを使用すると、 に示すようにpaintボックスが描画さJPanelれますIllustration 1

@Override
public void paint(Graphics g) {
    g.drawImage(currentImg, DEFAULT_LOCATION, DEFAULT_LOCATION, null);
}

あるイベントを介して、mousePressedこの例ではイメージが変更されます。

@Override
public void mousePressed( MouseEvent e ) {
        currentImg = circle;
        repaint();
}

目的の出力を に示しますIllustration 2。残念ながら、結果はIllustration 3.
問題は次のとおり
です。
- 別のことですが、画像を円 ( From ) に再描画するコードがある場合Illustration 3、ボックスは画像をオーバーレイするだけcircleです。

ここに画像の説明を入力

4

3 に答える 3

6

オーバーライドしますpaintComponent()(paint()メソッドではありません)。

電話super.paintComponent(g)

于 2013-01-08T09:40:07.363 に答える
6
  1. の呼び出しsuper.paintに失敗しました。これは、他の多くの重要なものとは別に、グラフィックスコンテキストをクリアします
  2. 通常はpaintComponentpaintを使用することをお勧めしますが、必ず呼び出すようにしてください。super.paintComponent

グラフィック コンテキストは共有リソースであり、再描画の合間に再利用される傾向があります。つまり、ペイントしたときにグラフィック コンテキストをクリアしなかったため、以前の「状態」が得られ、それが上書きされます。

于 2013-01-08T09:41:01.723 に答える
2

画面を再描画する必要があります。Javaは、再起動しないように指示するか、再起動するように指示するまで、苦痛を続けます。

super.paintComponent(g);

これをリセットできるようにします。または、空白にしたい部分の上に正方形を再描画する必要があります

g.clearRect(x,y,width,height)

左上隅がx、yの長方形をクリアできます

このコードを更新する

@Override
public void paint(Graphics g) {
g.drawImage(currentImg, DEFAULT_LOCATION, DEFAULT_LOCATION, null);
}

変更を許可します。また、paintComponent をオーバーライドする必要があります

于 2013-01-08T09:41:30.167 に答える