【问题标题】:Java Unnecessary Overlaying of ImagesJava 不必要的图像叠加
【发布时间】:2012-12-22 03:00:00
【问题描述】:

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
问题是:
- 为什么结果恰好是两个图像相互叠加?
- 另一件事,如果我有一个代码可以将图像重绘为圆形(来自Illustration 3),该框将覆盖circle 图像。

【问题讨论】:

    标签: java image swing paint paintcomponent


    【解决方案1】:
    1. 你没有调用super.paint,除了一大堆其他重要的东西之外,它还清除了图形上下文
    2. 您应该很少需要覆盖paint,通常首选使用paintComponent,但请确保您调用super.paintComponent

    图形上下文是一种共享资源,并且倾向于在重新绘制之间重复使用,这意味着,因为您在绘制时没有清除图形上下文,所以您已经获得了之前的“状态”,然后再绘制

    【讨论】:

    • 你好@MadProgrammer,请详细说明为什么我应该使用paintComponent而不是paint。
    • @MichaelArdan paint 将绘制组件及其子组件。
    • @MichaelArdan paint 调用paintComponent、paintBorder 和paintChildren,通过覆盖paint,您基本上剥离了组件功能来实际渲染其所有层。 Paint 还设置了双缓冲,这将防止更新闪烁
    • @MichaelArdan 您可能还想阅读一下Perfoming Custom Painting
    • 我明白了。非常感谢!
    【解决方案2】:

    覆盖 paintComponent()(不是 paint() 方法)。

    致电super.paintComponent(g)

    【讨论】:

    • 您好 StainslavL,在发布此问题之前,我已经尝试过您的方法。不适合我。
    • @MichaelArdan 然后发布 SSCCE 来说明问题
    • 请原谅我之前的评论。我已经尝试过paintComponent(),但我无法调用super.paintComponent(g)。这个答案对我有用
    • 不调用super.paintComponent(g)的结果是什么?
    【解决方案3】:

    您需要重新绘制屏幕。 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

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 2011-09-07
      • 2017-12-25
      • 2022-12-14
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多