我在GLWindow
中包含了两个JOGL原生NewtCanvasAWT
。
这些画布分别添加到JInternalFrame
个。 JInternalFrame
已添加到JDesktopPane
,已添加到JFrame
。
我没有Animator
正在运行,因为当场景发生变化时,手动调用.display()
。
除了一件事之外,此设置可以正常工作:
当第二个JInternalFrame
(创作顺序)移动到第一个时,第一个没有重新绘制,这是非常意外的,
当第一个移动到第二个时,第二个 重新绘制,正如预期的那样。
如果我添加更多帧,则只有最后一帧表现得符合预期。
JInternalFrames
是相同的(同一类)。
第一个GLWindow
在WindowUpdateEvent
中未收到WindowListener.windowRepaint()
。第二个是。
以下是来自工作 GLEventListener.display(GLAutoDrawable drawable)
的{{1}}的堆栈跟踪:
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
时,所有这些都不会发生。但是,我不想使用AWT线程进行渲染,而这些GLCanvas
使用它。 GLAutoDrawable
本机窗口工具包使用另一个线程。
答案 0 :(得分:1)
行。这是bug in JOGL。
我最终添加了一个监听JDesktopPane
添加的JInternalFrame
监听器。如果添加的框架包含GLWindow
,则会在List
中记住对其的引用。它还为每个 ComponentListener
的添加了共享JInternalFrame
。在componentHidden
/ componentMoved
/ componentResized
/ componentShown
个事件发生后,所有以前记住的GLWindow
都会被刷新。
修改:通过在.display()
上调用GLWindow
方法(继承自GLAutoDrawable
)来实现刷新。