2010-03-05 44 views
3

我有一个SWT应用程序,它在按下按钮后打开一个OpenGL窗口(使用LWJGL库)。它应该关闭它的主要SWT窗口并用OpenGL上下文打开一个新窗口。在Windows上正常工作。在Mac上,我得到这个错误:从Mac上的SWT应用程序打开LWJGL窗口

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对话框A按钮应该关闭对话框,并打开一个窗口LWJGL(org.lwjgl.opengl.Display)。

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

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

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

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

更新2:在这种特殊情况下,我使用SWT对话框Windows版本的应用程序和Mac版本解决了这个问题,我写了一个天然可可对话框,调用JVM和运行LWJGL应用程序需要时。这工作得很好。

回答

1

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

你可能有大约略有些运气比较好杂耍的东西:

  • 当你第一次创建LWJGL窗口会发生什么,然后创建一个SWT的壳呢?
  • 当您在创建SWT shell之前静态初始化LWJGL时会发生什么情况,然后继续创建shell并创建LWJGL窗口?

顺便说一句,收一个SWT窗口,所有你需要做的就是处置Shell的:

shell.dispose(); 
+0

你是对有关利益冲突。但是,我无法在实际尝试打开LWJGL显示窗口之前静态初始化LWJGL。 Sys中有一个静态构造函数,但它没有做任何实质性的工作。 – 2010-03-13 11:40:33

+0

当你启动一个LWJGL窗口然后一个SWT窗口时会发生什么? – 2010-03-13 16:19:39

+0

我很好奇它是如何为你制定的! – 2010-03-15 11:49:54

相关问题