在Java中实现双缓冲

6
我有一个简单的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个回答

8
首先,您应该避免混合使用重量级和轻量级组件(AWT 和 SWING),主要是因为它们使用非常不同的绘制方法来显示(如果您想了解更多,请阅读这里)。
所以,您可以使用JPanel代替Canvas。这也给出了您一个潜在的解决方案,因为JPanel有一个setDoubleBuffered(boolean)方法,更具体地说,这是在JComponent类中实现的。
我认为只需替换即可。
public class myCanvas extends Canvas

通过

public class myCanvas extends JPanel

虽然我还没有测试过这个,但我希望它能对你有帮助!

编辑: 当然,在main方法中设置framecanvas时,您需要放置方法调用。

canvas.setDoubleBuffered(true);

某个地方。


2
哇,那个完美地运行了!感谢您的快速回复和提供一个快速简单的解决方案! - kaptaincooke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接