由Graphics2D调用的Java绘制方法

时间:2015-09-01 01:44:59

标签: java swing bufferedimage graphics2d

我正在创建一个淡入式动画,每当我尝试使用以下方法绘制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一直被调用,直到我从另一个类调用它?谢谢!

1 个答案:

答案 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);
}