画布:双缓冲

时间:2013-11-25 23:57:31

标签: java swing graphics

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

所以我在Canvas上创建了一个双缓冲策略。我假设我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 个答案:

答案 0 :(得分:2)

三件事......

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

    了解更多详情