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);
        }
    }
}
4

1 回答 1

8

首先,您应该避免混合使用重型和轻型组件(AWT 和 SWING),主要是因为它们使用非常不同的方法来绘制显示器(如果您想了解更多信息,请阅读此处)。

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

我相信只需更换就足够了

public class myCanvas extends Canvas

经过

public class myCanvas extends JPanel

. 虽然我没有测试过,但我希望它对你有帮助!

编辑:当然,在设置你frame的方法时,你必须放置方法调用canvasmain

canvas.setDoubleBuffered(true);

某处。

于 2012-07-26T14:17:52.303 回答