1

でラップされた2 つのJOGLネイティブがあります。GLWindowNewtCanvasAWT

これらのキャンバスはそれぞれ に追加されJInternalFrameます。JInternalFrameが追加されJDesktopPane、 が に追加されJFrameます。

シーンが変わると手動で呼び出されるAnimatorため、実行していません。.display()


このセットアップは、次の 1 つのことを除けば、期待どおりに機能します。

  • 2 番目JInternalFrame(作成の順序) が 1 番目を超えると、最初は再描画されません。

  • 1 番目が 2 番目の上に移動すると、期待どおり、2 番目が再描画されます。

  • さらにフレームを追加すると、最後のフレームだけが期待どおりに動作します。

JInternalFrames同一です (同じクラス)。

最初は受信しGLWindowません。2番目のものはそうです。WindowUpdateEventWindowListener.windowRepaint()

作業中の私のスタックトレースはGLEventListener.display(GLAutoDrawable drawable)次のとおりです。 JInternalFrame

java.lang.IllegalArgumentException: test
    at edu.agh.tunev.ui.opengl.Scene.display(Scene.java:42)
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:373)
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:358)
    at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:280)
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:655)
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:594)
    at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:543)
    at jogamp.opengl.GLAutoDrawableBase.defaultWindowRepaintOp(GLAutoDrawableBase.java:99)
    at com.jogamp.newt.opengl.GLWindow.access$000(GLWindow.java:94)
    at com.jogamp.newt.opengl.GLWindow$1.windowRepaint(GLWindow.java:107)
    at jogamp.newt.WindowImpl.consumeWindowEvent(WindowImpl.java:2392)
    at jogamp.newt.WindowImpl.consumeEvent(WindowImpl.java:1943)
    at jogamp.newt.DisplayImpl.dispatchMessage(DisplayImpl.java:388)
    at jogamp.newt.DisplayImpl.dispatchMessages(DisplayImpl.java:436)
    at jogamp.newt.DisplayImpl$DispatchMessagesRunnable.run(DisplayImpl.java:371)
    at jogamp.newt.DefaultEDTUtil$EventDispatchThread.run(DefaultEDTUtil.java:293)

これは、最初のフレームでも発生するはずです。なぜそうしないのですか?


GLJPanelまたはを使用する場合、これはすべて発生しませんGLCanvas。ただし、レンダリングに AWT スレッドを使用したくありませんGLAutoDrawableNEWTネイティブ ウィンドウ ツールキットは別のスレッドを使用します。

4

1 に答える 1

1

わかった。これはJOGL のバグです。

JDesktopPane最終的に、追加をリッスンするリスナーをにJInternalFrame追加しました。追加されたフレームに が含まれている場合GLWindow、それへの参照をList. また、すべてのに共有を追加ComponentListenerます。// /イベントが発生すると、以前に記憶されたすべての が更新されます。 JInternalFramecomponentHiddencomponentMovedcomponentResizedcomponentShownGLWindow

編集: リフレッシュは.display()メソッド on GLWindow(から継承GLAutoDrawable) を呼び出すことによって実装されます。

于 2013-05-02T10:34:11.607 に答える