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

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

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

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

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

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

但是,如果您将整个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); 

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

您是否尝试过调用Frame.dispose()然后更改它? 我自己没试过,但它可能会奏效。

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

看看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); 

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

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

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

 GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

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

 setBounds(getGraphicsConfiguration().getBounds()); getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 

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

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

 dispose(); setUndecorated(true/false); setVisible(true); 

好吧,你将需要不同的帧实例。 您可以移动框架的内容而无需重新创建。 这里的关键是使您的代码不依赖于特定的框架。 无论如何,这是一个基本的良好做法。

尝试:

 dispose(); setUndecorated(true); setVisible(true); 

一探究竟。 希望它会有所帮助!!

下面是一个如何使ALT + Enter进入全屏而没有条形模式的代码,最小化时显示标题栏和开始栏:

 public class myTest extends JFrame{ //Your codes... //if "ALT" key on hold and "Enter" key pressed with it if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) { //if the JFrame has Title bar if (isUndecorated()) { //this will dispose your JFrame dispose(); //here to set it with no Title bar setUndecorated(false); pack(); setLocationRelativeTo(null); //as you dispose your JFrame, you have to remake it Visible.. setVisible(true); } else { dispose(); setUndecorated(true); setExtendedState(MAXIMIZED_BOTH); setVisible(true); } } //your codes }