Java 画布:双缓冲

Java 画布:双缓冲,java,swing,graphics,Java,Swing,Graphics,我喜欢创建一个带有双缓冲的小图形库,以避免闪烁 因此,我在画布上创建了一个双缓冲区策略。我假设Istrategy.getDrawGraphics()返回当前后台缓冲区(用于绘图的缓冲区)。然后我在缓冲器上画些东西。现在我假设strategy.show()将后缓冲区与前缓冲区翻转,以便后缓冲区显示在屏幕上。但在运行以下代码时,我没有看到黑色矩形: final JFrame frame = new JFrame(); frame.setSize(800, 600); frame.setVisible

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

因此,我在
画布上创建了一个双缓冲区策略。我假设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();
三件事

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


    有关详细信息

    谢谢。这并不是我问题的答案,但我听从你的暗示。我已经用
    JPanel
    替换了
    Canvas
    。因为我不知道在哪个事件中调用了
    paintComponent
    ,所以我一直在使用2个
    BufferedImages
    并进行交换。这工作正常,不会闪烁。此外,我还将引擎的所有图形方法,如
    drawCircle
    放在
    invokeAndWait
    中,因此我确信
    BufferedImage
    上的所有更改以及对
    JPanel
    的所有调用都在UI线程中执行。这可能不是很好,但它工作得很好,不会闪烁。这就是我需要的:)