我喜欢创建一个带有双缓冲的小图形库,以避免闪烁。
因此,我在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();
三件事。。。
- 您应该避免混合重量重和重量轻的组件(在
JFrame
中添加Canvas
) - 您应该避免在事件调度线程的上下文中使用
Thread.sleep
、长时间运行的循环或调用阻塞方法(如I/O)。这可能会阻止您的应用程序被绘制(除其他外)。相反,您应该考虑使用类似javax.swing.Timer
的东西,它将在后台线程中休眠,但将在事件调度线程的上下文中触发 - 默认情况下,Swing组件是双缓冲的
看看…
- Swing中的并发
- 执行自定义绘画
有关更多详细信息,