画布:双重缓冲



我喜欢创建一个带有双缓冲的小图形库,以避免闪烁。

因此,我在Canvas上创建了一个双缓冲区策略。我假设I strategy.getDrawGraphics()返回当前的后台缓冲区(用于绘图的缓冲区)。然后我在缓冲器上画了一些东西。现在我假设strategy.show()用前缓冲区翻转后缓冲区,这样后缓冲区就会显示在屏幕上。但当我运行以下代码时,我看不到黑色矩形:

final JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setVisible(true);
final Canvas canvas = new Canvas();
frame.add(canvas);
// Double Buffering
canvas.createBufferStrategy(2);
final BufferStrategy strategy = canvas.getBufferStrategy();
Graphics2D current = (Graphics2D) strategy.getDrawGraphics();
current.setColor(Color.BLACK);
current.fillRect(0, 0, 800, 600);
strategy.show(); // flip back buffer with front buffer?
current.dispose();
Toolkit.getDefaultToolkit().sync();
Thread.sleep(1000);
frame.dispose();

三件事。。。

  1. 您应该避免混合重量重和重量轻的组件(在JFrame中添加Canvas
  2. 您应该避免在事件调度线程的上下文中使用Thread.sleep、长时间运行的循环或调用阻塞方法(如I/O)。这可能会阻止您的应用程序被绘制(除其他外)。相反,您应该考虑使用类似javax.swing.Timer的东西,它将在后台线程中休眠,但将在事件调度线程的上下文中触发
  3. 默认情况下,Swing组件是双缓冲的

看看…

  • Swing中的并发
  • 执行自定义绘画

有关更多详细信息,

相关内容

  • 没有找到相关文章

最新更新