在Java中实现双缓冲(Implementing Double Buffering in Java)

2019-09-20 06:28发布

我有一个简单的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);
        }
    }
}

Answer 1:

首先,你应该避免混合重链和轻量级组件(AWT和Swing),主要是因为他们使用的绘图显示的非常不同的方法(阅读这里 ,如果你想知道更多)。

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

我相信这将足以只需更换

public class myCanvas extends Canvas

通过

public class myCanvas extends JPanel

。 虽然我没有测试过这一点,我希望它可以帮助你!

编辑:另外,当然,设置你的时候framecanvasmain方法,你就必须把方法调用

canvas.setDoubleBuffered(true);

某处。



文章来源: Implementing Double Buffering in Java