【发布时间】:2012-05-27 20:01:31
【问题描述】:
下面的代码只是在一个窗口中打开了一个画布,它的内容只是用红色填充。但是,在调整窗口大小时,它会闪烁很多,因为在每次重新绘制之前,画布似乎都会自行清除。经过一些琐碎的搜索后,似乎是因为 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);
}
}
【问题讨论】:
-
你是如何实现双缓冲的?我认为这不应该绘制白色矩形,因为您已经覆盖了导致它的方法......我已经在我的计算机上尝试了代码并且效果很好。
-
@zeller 您是按原样尝试代码还是没有双缓冲?我只是在尝试时使用了一种简单的方法来交换图像而不是内置缓冲区策略,但没有任何变化。
-
无双缓冲。它在闪烁,但这不是由于绘制了白色矩形。我认为你应该尝试内置的缓冲策略,这里有一个可能有帮助的帖子:stackoverflow.com/questions/5924697/java-double-buffering
标签: java canvas awt repaint vlcj