【问题标题】:Implementing Double Buffering in Java在 Java 中实现双缓冲
【发布时间】:2012-07-25 03:14:39
【问题描述】:

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

【问题讨论】:

    标签: java graphics doublebuffered


    【解决方案1】:

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

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

    我相信只要替换就足够了

    public class myCanvas extends Canvas
    

    通过

    public class myCanvas extends JPanel
    

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

    编辑: 另外,当然,在main 方法中设置framecanvas 时,您必须调用方法

    canvas.setDoubleBuffered(true);
    

    某处。

    【讨论】:

    • 哇,效果很好!感谢您的快速响应和快速、简单的解决方案!\
    猜你喜欢
    • 2017-06-16
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-02-20
    • 2012-03-22
    • 2011-01-05
    相关资源
    最近更新 更多