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方法,将框绘制到我们JPanelIllustration 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. 您应该很少需要覆盖paint,通常首选使用paintComponent,但请确保您调用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 回答