【问题标题】:java: IllegalStateException - Buffers have not been createdjava: IllegalStateException - 尚未创建缓冲区
【发布时间】:2011-06-22 08:23:42
【问题描述】:

我的一个服务器中有一个奇怪的异常。
同一个应用程序(java、swing)在多个服务器上运行。
每台服务器都运行双显示器。 相同的 jre 版本(jre 6 版本 24) 所有这些都在相当不错的 CPU/内存消耗中。

只有其中一个 - 当我将我的应用程序从一个监视器拖到另一个监视器时,它会引发 java.lang.IllegalStateException 异常。我在下面附上了完整的例外。 有谁有想法吗 ?

谢谢。

现在,看,例外:

java.lang.IllegalStateException: Buffers have not been created
    at sun.awt.windows.WComponentPeer.getBackBuffer(Unknown Source)
    at java.awt.Component$FlipBufferStrategy.getBackBuffer(Unknown Source)
    at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Unknown Source)
    at java.awt.Component$FlipBufferStrategy.revalidate(Unknown Source)
    at java.awt.Component$FlipBufferStrategy.revalidate(Unknown Source)
    at java.awt.Component$FlipBufferStrategy.getDrawGraphics(Unknown Source)
    at javax.swing.BufferStrategyPaintManager.prepare(Unknown Source)
    at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    at java.awt.Container.paint(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

【问题讨论】:

  • 是的。在我发布之前用 Google 搜索过。但我找不到这篇文章的任何线索。我用 intellij 生成了我的挥杆组件。我根本没有使用缓冲策略。

标签: java exception


【解决方案1】:

尝试将以下参数添加到您的 java 命令行:

-Dsun.java2d.d3d=false

【讨论】:

  • 这是什么?来自文档:关闭 Java 2D 系统对 Direct3D 的使用。它有什么作用?
  • 据我所知,java AWT 默认在 Windows 上使用 Direct3D(也用于 2D 渲染)。将其关闭(使用参数)可能会导致性能损失,但 Direct3D 在辅助屏幕上的播放效果不佳,尤其是当您的显卡具有 Direct3D 的硬件加速功能时(如今大多数情况下都这样做)。与尝试在辅助屏幕上运行 3D 游戏相比(效果不佳)。原因是显卡只为主显示器设置了加速设备上下文,以节省一些计算能力。
  • 这为我解决了问题。当我在辅助屏幕上调整窗口大小时,我得到了这个。至少我认为这是可重现的情况。 ;)
【解决方案2】:

尝试了以下方法,

-Dsun.java2d.d3d=假
-Dsun.java2d.noddraw=true
-Dsun.java2d.ddoffscreen=false
-DJ2D_D3D=假

并没有找到解决方案,我偶然发现了这个可行的方法。

jframe.createBufferStrategy(1);

http://www.java-gaming.org/index.php/topic,25021.0

【讨论】:

  • 这实际上解决了问题,在 Win 7 上最大化第二个屏幕上的 JFrame 时。只添加“this.createBufferStrategy(1);”到你的 JFrame 的构造函数。
【解决方案3】:

Oracle 错误数据库中就是这种情况:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6933331

来自错误评估:

.. 没有其他后果 比控制台中的堆栈跟踪转储(没有挂起,没有报告视觉伪影)

【讨论】:

  • 使用双显示器时,问题总是可重现的,并且它确实导致应用程序挂起和/或无法刷新带有香草摆动窗口的窗口。建议的解决方法(与 pap 的回答相同)解决了问题——如果您不需要 D3d 功能。
  • 这很奇怪——当我遇到这个问题时,JFrame 底部的按钮不会显示出来。我称之为“视觉伪影”。 (由约翰尼的回答解决)
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多