Реализация двойной буферизации в 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);
где-то.