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);
}
我正在努力创建淡入动画,但我 运行 遇到了一个问题,每当我尝试使用以下方法绘制 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);
}