第一个GLWindow在第一个NewtCanvasAWT中没有得到.repaint(),当有其他窗口时

时间:2013-04-29 14:46:09

标签: java swing awt jogl

我在GLWindow中包含了两个JOGL原生NewtCanvasAWT

这些画布分别添加到JInternalFrame个。 JInternalFrame已添加到JDesktopPane,已添加到JFrame

我没有Animator正在运行,因为当场景发生变化时,手动调用.display()


除了一件事之外,此设置可以正常工作:

  • 当第二个JInternalFrame(创作顺序)移动到第一个时,第一个没有重新绘制,这是非常意外的,

  • 当第一个移动到第二个时,第二个 重新绘制,正如预期的那样。

  • 如果我添加更多帧,则只有最后一帧表现得符合预期。

JInternalFrames是相同的(同一类)。

第一个GLWindowWindowUpdateEvent中未收到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本机窗口工具包使用另一个线程。

1 个答案:

答案 0 :(得分:1)

行。这是bug in JOGL

我最终添加了一个监听JDesktopPane添加的JInternalFrame监听器。如果添加的框架包含GLWindow,则会在List中记住对其的引用。它还为每个 ComponentListener添加了共享JInternalFrame。在componentHidden / componentMoved / componentResized / componentShown个事件发生后,所有以前记住的GLWindow都会被刷新。

修改:通过在.display()上调用GLWindow方法(继承自GLAutoDrawable)来实现刷新。