以下代码只是在一个窗口中显示一个画布,它只是用红色填充其内容。但是,当调整窗口大小时,它会闪烁很多,因为在每次重绘之前,画布看起来都会自行清除。经过一些微不足道的搜索后,似乎是因为update()
方法称为g.clearRect()
,但我现在已经覆盖了它,闪烁仍然存在,画布在重新绘制之前仍在清除。
我玩过双缓冲,据我所知,这似乎没有解决问题 - 我不确定它有多么有用,因为问题似乎更多是防止帆布在重新粉刷之前就已经清理干净了。
除非每个人都涌入并建议它,否则我在这个实例中使用来使用Canvas,而不是JPanel,因为在不同的时间点我使用相同的Canvas进行原生视频和VLCJ一起玩。
public class MyCanvas extends Canvas {
@Override
public void update(Graphics g) {
paint(g);
}
@Override
public void paint(Graphics g) {
//By the time we get here, the canvas has been cleared to its background colour
g.setColor(Color.RED);
g.fillRect(0, 0, getWidth(), getHeight());
}
public static void main(String[] args) {
JFrame frame = new JFrame();
MyCanvas c = new MyCanvas();
frame.add(c);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
答案 0 :(得分:2)
双重缓冲,正如预期的那样,结果不是问题 - 无论哪种方式画布都被清除,然后从AWT库内部的代码中进行绘制。
在追踪相关的内部结构后,似乎可以通过属性覆盖“明确前画”行为:
System.setProperty("sun.awt.noerasebackground", "true");
添加以下内容会在重新绘制之前停止在画布上擦除背景,从而停止相关的闪烁。
应该注意,此属性显然是特定于Sun VM的,因此不知道您是否在其他VM上获得类似行为。但它确实适用于我的用例。