2010-03-05 110 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