我有一个 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 想要添加另一个菜单。
Facts:
SWT 对话框中的按钮应该关闭对话框并打开 LWJGL 窗口 (org.lwjgl.opengl.Display)。
该按钮在应用程序中设置一个静态变量,告诉它在 SWT 窗口关闭后下一步要做什么,因此 LWJGL 窗口不会直接从 SWT 回调打开。
然后该按钮将关闭 SWT 窗口。我不知道执行此操作的正确方法,但尝试了 shell.close、shell.dispose、display.close 和 display.dispose 的各种组合,但没有一个起作用。他们都关闭了窗口,但每次都会出现错误。
有谁知道可以做些什么来使这项工作有效?
UPDATE:这根本行不通,而且苹果似乎永远不会修复它。解决这个问题的唯一方法是启动一个新的应用程序实例并向其传递一个参数,告诉它打开第二个窗口。
更新2:在这种特殊情况下,我通过对 Windows 版本的应用程序使用 SWT 对话框解决了该问题,而对于 Mac 版本,我编写了一个本机 Cocoa 对话框,该对话框调用 JVM 并在需要时运行 LWJGL 应用程序。这效果很好。
在我看来,问题不在于 SWT 创建新窗口,也不在于 LWJGL 实际上这样做。我认为问题在于,在Mac下,应用程序菜单必须注册到进程中,并且由于某种原因,两者之间存在利益冲突。
你可能会更幸运地处理一些事情:
- 当你首先创建一个 LWJGL 窗口时会发生什么,then创建 SWT shell?
- 当您在创建 SWT shell 之前静态初始化 LWJGL,然后继续创建 shell 并创建 LWJGL 窗口时,会发生什么情况?
顺便说一句,要关闭 SWT 窗口,您所需要做的就是处理掉Shell
:
shell.dispose();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)