3

我有一个 SWT 应用程序,在按下按钮后会打开一个 OpenGL 窗口(使用 LWJGL 库)。它应该关闭它的主 SWT 窗口并使用 OpenGL 上下文打开一个新窗口。在 Windows 上运行良好。在 Mac 上,我收到此错误:

2010-03-05 02:28:25.315 java[1315:a07] [Java CocoaComponent compatibility mode]: Enabled
2010-03-05 02:28:25.316 java[1315:a07] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2010-03-05 02:28:25.317 java[1315:a07] Apple AWT Startup Exception : _createMenuRef called with existing principal MenuRef already associated with menu
2010-03-05 02:28:25.318 java[1315:a07] Apple AWT Restarting Native Event Thread

SWT 窗口关闭,然后应用程序挂起,没有打开任何窗口。

看起来 SWT 应用程序没有完全关闭并留下与其关联的菜单条目,这会阻止 LWJGL 窗口打开。Mac OS X 只需要一个应用程序菜单。SWT 没有释放它自己的菜单,而 LWJGL 想要添加另一个。

事实:

  • SWT 对话框中的按钮应该关闭对话框并打开 LWJGL 窗口 (org.lwjgl.opengl.Display)。

  • 该按钮在应用程序中设置一个静态变量,告诉它在 SWT 窗口关闭后下一步该做什么,因此不会直接从 SWT 回调打开 LWJGL 窗口。

  • 然后该按钮关闭 SWT 窗口。我不知道这样做的正确方法,但尝试了 shell.close、shell.dispose、display.close 和 display.dispose 的各种组合,但都没有奏效。他们都关闭了窗口,但每次都会发生错误。

有谁知道可以做些什么来完成这项工作?

更新:这根本行不通,而且苹果似乎永远不会修复它。解决它的唯一方法是启动一个新的应用程序实例并传递一个参数,告诉它打开第二个窗口。

更新 2:在这种特殊情况下,我通过对应用程序的 Windows 版本和 Mac 版本使用 SWT 对话框解决了这个问题,我编写了一个本机 Cocoa 对话框,它调用 JVM 并在需要时运行 LWJGL 应用程序。这很好用。

4

1 回答 1

1

在我看来,问题不在于 SWT 创建新窗口或 LWJGL 实际这样做。相信问题出在Mac下,应用程序菜单必须要注册到进程中,而且由于某种原因,两者之间存在利益冲突。

你可能会有更好的运气来处理一些事情:

  • 当您首先创建 LWJGL 窗口,然后创建 SWT shell 时会发生什么?
  • 当您在创建 SWT shell 之前静态初始化 LWJGL,然后继续创建 shell 并创建 LWJGL 窗口时会发生什么?

顺便说一句,要关闭 SWT 窗口,您需要做的就是处理Shell

shell.dispose();
于 2010-03-13T01:05:25.670 回答