Jpanel中的双缓冲图像示例

时间:2013-08-19 09:37:08

标签: java swing bufferedimage double-buffering

我会知道我的实现对于双缓冲图像是否正确..因为我注意到我在屏幕中移动的图像边框颤抖......这是正常的吗?

public void paintComponent(Graphics g) {
    Image bufferimage= createImage(180,180);
    Graphics dbg= bufferimage.getGraphics();

    //clean the screen
    dbg.setColor(new Color(100,100,100));
    dbg.fillRect(0,0,getWidth(),getHeight());

    if (game_is_running) {
       // draw various type of object with drawImage
       for(int i=0; list[i]!=null; i++) {
           list[i].draw(dbg);
       }
       target.draw(dbg);
       I.draw(dbg);
    }

    //finally draw the image linked to graphics
    g.drawImage(bufferimage,0,0,this);
}

2 个答案:

答案 0 :(得分:3)

bufferimage的创建移出paintComponent()方法。每次调用该方法时都不需要创建它。无论如何,你正在绘制整个表面。

完成从Graphics检索到的bufferImage(例如您的dbg变量)后,您应该在其上调用dispose()

最后,如果确保组件和包含它的组件将属性doubleBufferred设置为true,则可以在没有第二个图像的情况下离开。

答案 1 :(得分:3)

所有paintComponent()方法都应该绘制图像。

“如果游戏正在运行”代码不属于paintComponent()方法。我们的想法是让计时器或其他东西改变你的游戏状态,并在你的图像上进行自定义绘图。然后,当Swing调用paintComponent()方法时,您可以简单地将图像绘制为当前状态。

查看Custom Painting Approaches中的DrawOnImage示例。该代码使用鼠标为图像添加矩形。然后,每当重新绘制组件时,图像都会被绘制。

想法是创建/修改图像一次,然后重新绘制图像。在游戏中,可能会发现每次修改图像时都会绘制它,但代码不应该是paintComponent()方法的一部分。