全屏幕Swing与JOGL

6
我正在尝试制作一个全屏渲染的Swing应用程序,遵循此处的说明http://download.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html和源代码http://download.oracle.com/javase/tutorial/extra/fullscreen/example-1dot4/DisplayModeTest.java

这个方法运行得很好,但是一旦我将GLCanvas对象作为帧的一个组件放入其中,就只会显示一个黑屏。退出全屏后,我可以看到OpenGL图像在全屏状态下出现了一会儿,然后在窗口中正常显示。即使没有显示任何内容,我也可以像与swing组件一样与按钮进行交互。

对我来说,似乎另一个空白缓冲区被绘制在实际的swing应用程序上方,但我无法弄清楚为什么会这样。或者,我想知道是否不是由处理JOGL的图形卡处理全屏的问题?

虽然硬件加速的全屏可能很好,但我并不需要它-如果无法解决此问题,是否有更可靠的方法在Java应用程序中实现全屏?


操作系统?OpenGL 实现供应商? - genpfault
抱歉,我太天真了,认为这个程序是跨平台的。我使用的是Windows 7和Nvidia GForce 9600M GT。 - dimo414
2个回答

3

根据此FAQ所述,尝试禁用-Dsun.java2d.noddraw=true


谢谢,那个完美无缺地运行了。现在我得去想出强制每次运行时包含这个命令行参数的最佳方法。 - dimo414
2
通过设置 System.setProperty("sun.java2d.noddraw", "true"); 进行测试。 - dacwe
辉煌,谢谢。现在我只需要想办法在窗口显示后启用和禁用框架装饰(setUndecorated()?)。我会自己去问或搜索这个问题,除非你还想再帮我一些? :P - dimo414
2
是的! :) frame.setUndecorated(true) - dacwe

0

您不能在可显示的窗口上调用setUndecorated(...)方法,您必须先将其释放,但这也会释放画布。使用共享的可绘制对象来完成此操作,并在调用frame的dispose()方法之前将其移除。


是的,我也遇到了那个问题。对于我的应用程序来说,这只是一个小问题,但我仍然希望能够正确地解决它。您能详细说明一下您所说的“使用共享可绘制对象并将其删除”是什么意思吗? - dimo414
我遇到了同样的问题。如果您只使用共享上下文,当您从窗口中删除画布时,此上下文将被销毁,除非您使用NEWT而不是AWT / Swing。您可以在此处查看共享可绘制对象的示例:http://jogamp.org/git/?p=jogl.git;a=blob;f=src/junit/com/jogamp/test/junit/jogl/acore/TestSharedContextListAWT.java;h=b44158dce98537b7e12e4a354a702d0082f2b4ef;hb=de2a30104098216963132ed02b3dd66acd799d9e#l65 - gouessej
1
我发现我遇到的问题的真正原因是OpenGL面板的init()中有一些只运行一次的设置代码。由于在重新显示面板时会再次调用init(),因此它会重新运行。通过将只运行一次的代码移动到构造函数中,我解决了我看到的问题,现在它完美地工作了:D - dimo414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接