我有一个 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 应用程序。这很好用。