Java Graphics2D 正在调用 Paint 方法

Java Paint Method Being Called By Graphics2D

我正在努力创建淡入动画,但我 运行 遇到了一个问题,每当我尝试使用以下方法绘制 BufferedImage 时:

g2d.drawImage(unknown.getScaledInstance(100, 200, BufferedImage.SCALE_SMOOTH),
10,button.getLocation().y - 200, this);

使用后

.setCompositeAlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity)

我的 JPanel 的 paint 方法不断被反复调用。我试着注释掉 drawImage 位,一切都再次正常工作。我还注意到,当我使用以下方法从另一个 class 调用 paint 方法时:

answerPanel.paint(answerPanel.getGraphics());

paint 方法停止被连续调用。 那么谁能阐明为什么 drawImage 行导致 paintMethod 被不断调用,直到我从另一个 class 调用它?谢谢!

同意@user2864740,你不应该直接调用paint(...),但我认为这不是问题的根源。

drawImage(...)(例如 this)的最后一个参数是 ImageObserver。每当更新(更改)Image 时,它都会收到回调,并将导致 repaint()(最终会调用 paint())。

当您调用 Image.getScaledInstance(...) 时,这将立即 return 一个新的 Image 实例,但实际的 缩放 (或者,重采样,真的) 稍后会发生。一旦(部分)缩放图像完成,图像观察器将处理 "automagic" 组件的重绘。您的组件将被要求重绘一次或多次。

你应该能够通过将 null 作为最后一个参数而不是 this 传递来观察其效果(可能不会绘制任何内容,但你会避免重绘循环)。

您的组件将进入重绘循环的原因是,每次要求组件重绘自身时,都会 new 缩放实例 returned,导致图像观察者重新开始缩放和自动重新绘制,如上所述。

要解决此问题,请不要使用 getScaledInstance(),而是尝试:

g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2d.drawImage(unknown, 10, button.getLocation().y - 200, 100, 200, this);

另一种方法是确保只创建一次重新缩放的图像,并在每次重绘时继续使用它:

Image scaled;

public void paint(Graphics g) {
    ...

    if (scaled == null) {
        scaled = unknown.getScaledInstacnce(100, 200);
    }

    ...

    g2d.drawImage(scaled, 10, button.getLocation().y - 200, this);
}