在Java中实现双缓冲

时间:2012-07-26 13:57:37

标签: java graphics doublebuffered

我有一个简单的Java JFrame画布。我每半秒左右更新屏幕上的内容,并且闪烁。我想实现双缓冲以消除闪烁,但我对Java很新,并且不熟悉如何这样做。我找到了一些例子,但不知道如何将他们的方法实现到我的。

以下是我现在如何处理的基本设置。这不是我的确切代码 - 只是基本设置的一个示例。

感谢任何正确方向的推动!

public class myCanvas extends Canvas{
    //variables
    Color rectColor=Color.red;

    public myCanvas()
    {
    }

    public void paint(Graphics graphics)
    {
        //initial setup, such as
        graphics.setColor(rectColor);
        graphics.fillRect(X,Y,W,H);
    }
    public static void main(String[] args)
    {
        myCanvas canvas = new myCanvas();
        JFrame frame = new JFrame("GUI");
        frame.setSize(frameWidth,frameHeight);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(canvas);
        frame.setVisible(true);
        while(true){
            rectColor=Color.green;
            canvas.validate();
            canvas.repaint();
            Thread.sleep(500);
        }
    }
}

1 个答案:

答案 0 :(得分:7)

首先,你应该避免混合重型和轻量级组件(AWT和SWING),主要是因为它们使用非常不同的方法绘制到显示器(如果你想了解更多,请阅读here)。 / p>

因此,您可以使用Canvas代替JPanel。这也为您提供了一个潜在的解决方案,因为JPanel有一个方法setDoubleBuffered(boolean),更具体地说,这是在JComponent类中实现的。

我认为只需更换

就足够了
public class myCanvas extends Canvas

通过

public class myCanvas extends JPanel

。虽然我没有测试过这个,但我希望它可以帮到你!

编辑: 此外,当然,在frame方法中设置canvasmain时,您必须进行方法调用

canvas.setDoubleBuffered(true);

的某个地方。