我有一个swt应用程序,在按下按钮后打开一个opengl窗口(使用lwjgl库)。它应该关闭它的主swt窗口,并打开一个带有opengl上下文的新窗口。在窗户上很好用。在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窗口的打开。MacOSX只需要一个应用程序菜单。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应用程序。效果很好。