【问题标题】:"Buffers have not been created" ... whilst creating buffers“尚未创建缓冲区” ...在创建缓冲区时
【发布时间】:2010-08-08 20:42:05
【问题描述】:

我有(我认为是)一个用于 JFrame 的简单的 BufferStrategy。它是这样创建的:

    // Buffer
    container.createBufferStrategy(2);           
    strategy = container.getBufferStrategy();

但是,我偶尔会收到以下错误(指向前面的 sn-p 的第一行作为违规项目):

java.lang.IllegalStateException:尚未创建缓冲区

这个错误来来去去都是奇特的——有时会被触发,有时不会。我怀疑这意味着这是一个线程问题。有没有人对这里可能发生的事情有任何指示?我有点不知所措,因为我已经在尝试做 Java 说它想让我做的事情!

编辑:完整跟踪:

Exception in thread "main" java.lang.IllegalStateException: Buffers have not been created
        at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:877)
        at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815)
        at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800)
        at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791)
        at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3730)
        at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4253)
        at java.awt.Component.createBufferStrategy(Component.java:3612)
        at java.awt.Window.createBufferStrategy(Window.java:3015)
        at java.awt.Component.createBufferStrategy(Component.java:3536)
        at java.awt.Window.createBufferStrategy(Window.java:2990)

【问题讨论】:

  • 请在您的问题中添加完整的堆栈跟踪 - 它应该有助于了解 哪个 方法正在抛出 ISE。我查看了 jre 源代码 (1.7),但找不到该异常的潜在来源。
  • 这真的是完整的堆栈跟踪吗?我们正在寻找您从 EDT 致电的证据。继续并显示完整的堆栈跟踪。
  • @Kevin Day, Exception in thread "main" 暗示这不是来自美国东部时间。
  • @finw - 同意,这就是为什么我想查看完整的堆栈跟踪,所以我们可以告诉他它是从哪里调用的。我真正的希望是,所有这些对堆栈跟踪的请求将为 OP 提供一些关于如何解决此类问题的想法。
  • 我很抱歉 - 我在帖子中添加的内容不是完整的堆栈跟踪吗?这就是我在 IDE 的控制台窗口中得到的。我是否必须专门编写一个调用来将堆栈跟踪转储到某处?

标签: java swing buffer awt


【解决方案1】:

当您调用createBufferStrategy 时,该框架需要是可显示的。此外,正如 camickr 所指出的,您需要从 EDT 调用它。

确保这一点的一种方法是扩展 JFrame 并覆盖 addNotify

class MyFrame extends JFrame {
    public void addNotify() {
        super.addNotify();
        // Buffer
        createBufferStrategy(2);           
        strategy = getBufferStrategy();
    }
}

【讨论】:

    【解决方案2】:

    默认情况下,Swing 组件是双缓冲的,因此无需使用 BufferStrategy。

    但是,当您遇到此类随机错误时,通常是因为代码未在 EDT 上执行。阅读 Concurrency 上的 Swing 教程部分了解更多信息。

    【讨论】:

    • 我更喜欢手动更新图形,因此可以访问实际的 BufferStrategy 对象使这非常简单 - 将大量项目绘制到图形中,然后只需调用 strategy.show() 一旦我完毕。如果这是一种可怕的做事方式,请纠正我!我肯定会阅读更多关于并发的内容。
    • 我认为我的建议表明了我对使用 BufferedStrategy 的看法,我认为这在使用 AWT 时可能会有所帮助,但正如我提到的 Swing 不同。该教程还有一个关于“自定义绘画”的部分,你应该看看
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多