我有一个简单的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);
}
}
}
答案 0 :(得分:7)
首先,你应该避免混合重型和轻量级组件(AWT和SWING),主要是因为它们使用非常不同的方法绘制到显示器(如果你想了解更多,请阅读here)。 / p>
因此,您可以使用Canvas
代替JPanel
。这也为您提供了一个潜在的解决方案,因为JPanel
有一个方法setDoubleBuffered(boolean)
,更具体地说,这是在JComponent
类中实现的。
我认为只需更换
就足够了public class myCanvas extends Canvas
通过
public class myCanvas extends JPanel
。虽然我没有测试过这个,但我希望它可以帮到你!
编辑:
此外,当然,在frame
方法中设置canvas
和main
时,您必须进行方法调用
canvas.setDoubleBuffered(true);
的某个地方。