Реализация двойной буферизации в Java

У меня есть простой холст 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);
        }
    }
}

1 ответ

Решение

Прежде всего, вам следует избегать смешивания тяжелых и легких компонентов (AWT и SWING), главным образом потому, что они используют очень разные методы рисования на дисплее (читайте здесь, если вы хотите узнать больше).

Так что вместо CanvasВы могли бы использовать JPanel, Это также дает вам потенциальное решение, потому что JPanel есть метод setDoubleBuffered(boolean)более конкретно, это реализовано в JComponent учебный класс.

Я считаю, что было бы достаточно просто заменить

public class myCanvas extends Canvas

от

public class myCanvas extends JPanel

, Хотя я не проверял это, я надеюсь, что это поможет вам!

РЕДАКТИРОВАТЬ: Кроме того, конечно, при настройке вашего frame а также canvas в main метод, вам придется разместить вызов метода

canvas.setDoubleBuffered(true);

где-то.

Другие вопросы по тегам