Открытие окна LWJGL из приложения SWT на Mac - PullRequest
3 голосов
/ 05 марта 2010

У меня есть приложение 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 при необходимости. Это работает очень хорошо.

1 Ответ

1 голос
/ 13 марта 2010

Мне кажется, что проблема не в том, что SWT создает новое окно, или в LWJGL это действительно происходит. Я считаю, что проблема заключается в том, что под Mac меню приложения должно быть зарегистрировано в процессе, и по тем или иным причинам между ними возникает конфликт интересов.

Возможно, вам повезет немного поиграть:

  • Что происходит, когда вы сначала создаете окно LWJGL, , а затем создаете оболочку SWT?
  • Что происходит, когда вы статически инициализируете LWJGL перед созданием оболочки SWT, а затем приступаете к созданию оболочки и созданию окна LWJGL?

Между прочим, чтобы закрыть окно SWT, все, что вам нужно сделать, это избавиться от Shell:

shell.dispose();
...