6

単純なJavaJFrameキャンバスがあります。画面に表示されているものを0.5秒ごとに更新していますが、ちらつきがあります。ちらつきをなくすためにダブルバッファリングを実装したいのですが、私は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 に答える