У меня есть приложение 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, поэтому окно LWJGL НЕ открывается непосредственно из обратного вызова SWT.
Кнопка затем закрывает окно SWT. Я не знаю правильный способ сделать это, но пробовал различные комбинации shell.close, shell.dispose, display.close и display.dispose, ни один из них не сработал. Все они закрывают окно, но ошибка возникает каждый раз.
Кто-нибудь знает, что можно сделать, чтобы сделать эту работу?
ОБНОВЛЕНИЕ : Это просто не работает, и кажется, что Apple никогда не исправит это. Единственный способ обойти это - запустить новый экземпляр приложения и передать ему параметр, который говорит ему открыть второе окно.
ОБНОВЛЕНИЕ 2: В этом конкретном случае я решил проблему с помощью диалогового окна SWT для версии приложения для Windows и для версии для Mac, я написал собственный диалог Какао, который вызывает JVM и запускает приложение LWJGL при необходимости. Это работает очень хорошо.