我正在创建一个淡入式动画,每当我尝试使用以下方法绘制BufferedImage时,我遇到了一个问题:
g2d.drawImage(unknown.getScaledInstance(100, 200, BufferedImage.SCALE_SMOOTH),
10,button.getLocation().y - 200, this);
使用后
.setCompositeAlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity)
我的JPanel的绘画方法经常被反复和不断地调用。我试着评出drawImage位,一切都恢复正常。我还注意到当我使用:
从另一个类调用paint方法时answerPanel.paint(answerPanel.getGraphics());
持续调用paint方法。 那么有人可以解释为什么drawImage行导致paintMethod一直被调用,直到我从另一个类调用它?谢谢!
答案 0 :(得分:0)
同意@ user2864740,你不应该直接调用paint(...)
,但我认为这不是问题的根源。
drawImage(...)
的最后一个参数(例如this
)是ImageObserver
。每当Image
更新(更改)时,它都会收到回调,并会导致repaint()
(最终会调用paint()
)。
当您调用Image.getScaledInstance(...)
时,这将立即返回一个新的Image
实例,但实际的扩展(或实际重新采样)将在稍后发生。一旦缩放图像(部分)完成,图像观察器将处理组件的“自动”重绘。您将要求您重新组织一次或多次。
你应该能够通过传递null
作为最后一个参数而不是this
来观察到这种效果(可能没有任何东西会被绘制,但你会避免重绘循环)
组件进入重绘循环的原因是,每次要求组件重新绘制自身时,都会返回 new 缩放的实例,从而导致重新开始缩放和自动重新绘制由图像观察者,如上所述。
要解决此问题,请不要使用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);
}