如何在框架可见后调用setUndecorated()?

Luc*_*cky 21 java swing fullscreen

在我的Swing应用程序中,我希望能够在装饰和未装饰之间切换,而无需重新创建整个框架.但是,在setUndecorated()框架可见后,API不允许我调用.

即使我打电话setVisible(false),isDisplayable()仍然会返回true.API说,使帧不可显示的唯一方法是重新创建它.但是,我不想重新创建框架只是为了关闭一些标题栏.

我正在制作一个可在全屏和窗口模式之间切换的全屏应用程序; 它应该能够在保持状态等的同时切换.

如何在框架可见后执行此操作?

Yis*_*hai 25

你试过打电话Frame.dispose()然后改变吗?我自己没试过,但它可能会奏效.

如果没有,那么你可以做的就是让这个框架成为一个无关紧要的部分,只需要最高级别的面板或面板的最小钩子,然后将它们移动到新的框架.所有的孩子都会跟着.

  • 它的惊人和简单的解决方案非常感谢你我做了这个dispose(); "setUndecorated(真); setExtendedState(JFrame.MAXIMIZED_BOTH); 调用setVisible(真);" (2认同)

Ste*_*eod 17

你不能.这是我尝试实现同样目标时的经验.

但是,如果您将整个UI放在框架中的一个面板中,则可以创建一个新框架并将该面板添加到框架中.没那么多工作.

像这样的东西:

// to start with
JPanel myUI = createUIPanel();
JFrame frame = new JFrame();
frame.add(myUI);

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);
Run Code Online (Sandbox Code Playgroud)

在Swing中,面板(实际上是组件的任何实例)一次只能在一个帧中,因此当您将其添加到新帧时,它会立即停止在旧帧中.

  • 调用`dispose()`释放本机窗口资源.然后你可以编辑未修饰的属性等.使用`pack()`重新创建窗口资源.然后只需调用`setVisible(true)`并且一切正常(位置和所有组件都不会被更改) (5认同)

小智 12

看看https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

在方法中switchFullscreenMode():

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);
Run Code Online (Sandbox Code Playgroud)

实际上还有很多东西可以隐藏各种侧面板,如果鼠标接触到侧面则会再次出现.

另请注意,您必须显式设置边界.Window.setExtendedState(MAXIMIZED_BOTH)在dispose()及时附近严重干扰,因为它们都依赖于操作系统的多个本机事件,如果窗口在该瞬间不可显示则丢失.

我不建议直接使用默认屏幕:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
Run Code Online (Sandbox Code Playgroud)

而使用屏幕,你的JFrame目前正在:

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);
Run Code Online (Sandbox Code Playgroud)

虽然它目前是相同的,但它可能会在未来发生变化.


Tho*_*mas 12

调用dispose()释放本机窗口资源.然后你可以编辑未修饰的属性等.然后只需调用setVisible(true)重新创建窗口资源,一切正常(位置和所有组件都不会被更改)

dispose();
setUndecorated(true/false);
setVisible(true);
Run Code Online (Sandbox Code Playgroud)