Implementing Double Buffering in Java

青春壹個敷衍的年華 提交于 2019-12-13 13:07:43

问题


I have a simple Java JFrame canvas. I am updating what is on the screen every half second or so, and have flickering. I want to implement double buffering to eliminate the flickering, but I am fairly new to Java and am unfamiliar with how to do so. I have found some examples, but not sure how to implement their methods into mine.

Below is the basic setup of how I have things now. This is not my exact code- just an example of the basic setup.

Thanks for any push in the right direction!

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:


First of all, you should avoid mixing heavy- and lightweight components (AWT and SWING), mostly because they use very different methods of drawing to the display (read here if you want to know more).

So instead of the Canvas, you could use a JPanel. This also gives you a potential solution, because JPanel has a method setDoubleBuffered(boolean), more specifically, this is implemented in the JComponent class.

I believe it would be sufficient to just replace

public class myCanvas extends Canvas

by

public class myCanvas extends JPanel

. Although I haven't tested this, I hope it helps you!

EDIT: Also, of course, when setting up your frame and canvas in the main method, you'd have to place the method call

canvas.setDoubleBuffered(true);

somewhere.



来源:https://stackoverflow.com/questions/11670916/implementing-double-buffering-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!