Java 画布:双缓冲
我喜欢创建一个带有双缓冲的小图形库,以避免闪烁 因此,我在Java 画布:双缓冲,java,swing,graphics,Java,Swing,Graphics,我喜欢创建一个带有双缓冲的小图形库,以避免闪烁 因此,我在画布上创建了一个双缓冲区策略。我假设Istrategy.getDrawGraphics()返回当前后台缓冲区(用于绘图的缓冲区)。然后我在缓冲器上画些东西。现在我假设strategy.show()将后缓冲区与前缓冲区翻转,以便后缓冲区显示在屏幕上。但在运行以下代码时,我没有看到黑色矩形: final JFrame frame = new JFrame(); frame.setSize(800, 600); frame.setVisible
画布上创建了一个双缓冲区策略。我假设Istrategy.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();
三件事
您应该避免混合使用重型和轻型组件(将Canvas
添加到JFrame
)
您应该避免在事件调度线程的上下文中使用Thread.sleep
、长时间运行的循环或调用阻塞方法(如I/O)。这可能会阻止您的应用程序被绘制(除其他外)。相反,您应该考虑使用类似于<代码> javax、Swing、Time<代码>之类的东西,它将在后台线程中休眠,但将在事件调度线程 的上下文中触发。
默认情况下,Swing组件是双缓冲的
看看
有关详细信息谢谢。这并不是我问题的答案,但我听从你的暗示。我已经用JPanel
替换了Canvas
。因为我不知道在哪个事件中调用了paintComponent
,所以我一直在使用2个BufferedImages
并进行交换。这工作正常,不会闪烁。此外,我还将引擎的所有图形方法,如drawCircle
放在invokeAndWait
中,因此我确信BufferedImage
上的所有更改以及对JPanel
的所有调用都在UI线程中执行。这可能不是很好,但它工作得很好,不会闪烁。这就是我需要的:)