代码之家  ›  专栏  ›  技术社区  ›  Tomas Andrle

从Mac上的SWT应用程序打开LWJGL窗口

  •  3
  • Tomas Andrle  · 技术社区  · 14 年前

    我有一个swt应用程序,在按下按钮后打开一个opengl窗口(使用lwjgl库)。它应该关闭它的主swt窗口,并打开一个带有opengl上下文的新窗口。在窗户上很好用。在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窗口的打开。MacOSX只需要一个应用程序菜单。swt没有免费提供自己的菜单,lwjgl想再添加一个。

    事实:

    • swt对话框中的一个按钮应该关闭对话框并打开一个lwjgl窗口(org.lwjgl.opengl.display)。

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

    • 然后按钮关闭SWT窗口。我不知道正确的方法,但是尝试了shell.close、shell.dispose、display.close和display.dispose的各种组合,但都没有成功。他们都关闭了窗口,但每次都会出错。

    有人知道怎么做才能让这件事成功吗?

    更新 :这根本不起作用,苹果似乎永远也不会修复它。唯一的办法是启动一个新的应用程序实例,并向它传递一个参数,告诉它打开第二个窗口。

    更新2: 在这个特殊的例子中,我通过在windows版本的应用程序和mac版本中使用swt对话框解决了这个问题,我编写了一个本地cocoa对话框,它调用jvm并在需要时运行lwjgl应用程序。效果很好。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Paul Lammertsma    14 年前

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

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

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

    顺便说一下,要关闭SWT窗口,您只需要处理 Shell :

    shell.dispose();