【问题标题】:Opening a LWJGL window from a SWT app on Mac在 Mac 上从 SWT 应用程序打开 LWJGL 窗口
【发布时间】:2010-03-05 13:05:49
【问题描述】:

我有一个 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 窗口关闭后下一步该做什么,因此不会直接从 SWT 回调打开 LWJGL 窗口。

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

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

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

更新 2: 在这种特殊情况下,我通过使用适用于 Windows 版本的应用程序的 SWT 对话框解决了这个问题,对于 Mac 版本,我编写了一个调用 JVM 的本机 Cocoa 对话框并在需要时运行 LWJGL 应用程序。效果很好。

【问题讨论】:

    标签: java macos swt lwjgl


    【解决方案1】:

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

    你可能会有更好的运气来处理一些事情:

    • 如果先创建 LWJGL 窗口,然后创建 SWT shell,会发生什么情况?
    • 如果在创建 SWT shell 之前静态初始化 LWJGL,然后继续创建 shell 并创建 LWJGL 窗口,会发生什么?

    顺便说一句,要关闭一个 SWT 窗口,您需要做的就是处理掉Shell

    shell.dispose();
    

    【讨论】:

    • 您对利益冲突的看法是正确的。但是,在实际尝试打开 LWJGL 显示窗口之前,我无法静态初始化 LWJGL。 Sys 中有一个静态构造函数,但这并没有做任何实质性的事情。
    • 启动 LWJGL 窗口然后启动 SWT 窗口时会发生什么?
    • 它不起作用。我发现了关于这个问题的无穷无尽的线索,一位苹果工程师试图解决这个问题多年但没有给出解决方案。我已经完全放弃了尝试。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多