Java 框架可见后如何调用setUnderatted()?

Java 框架可见后如何调用setUnderatted()?,java,swing,fullscreen,Java,Swing,Fullscreen,在我的Swing应用程序中,我希望能够在装饰和未装饰之间切换,而无需重新创建整个框架。但是,API不允许我在框架可见后调用setUndercorated() 即使调用setVisible(false),isDisplayable()仍然返回true。API说,使帧不可显示的唯一方法是重新创建它。但是,我不想仅仅为了关闭一些标题栏而重新创建框架 我正在制作一个全屏应用程序,可以在全屏和窗口模式之间切换;它应该能够在保持状态等的同时进行切换 帧可见后如何执行此操作?嗯,您将需要不同的帧实例。您可以在

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

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

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


帧可见后如何执行此操作?

嗯,您将需要不同的帧实例。您可以在不重新创建框架的情况下移动框架的内容。这里的关键是使代码不依赖于特定的框架。这在任何情况下都是一个基本的良好实践。

您是否尝试过调用
Frame.dispose()
然后对其进行更改?我自己也没试过,但可能有用


如果没有,那么您可以做的是让框架成为类中无关紧要的部分,只需要最少量的钩子就可以连接到最高级别的一个或多个面板,然后将它们移动到新框架。所有的孩子都会跟着。你不能。当我试图达到同样的目标时,这就是我的经历

但是,如果将整个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中,面板(以及组件的任何实例)一次只能在一个帧中,因此当您将其添加到新帧中时,它将立即停止在旧帧中。

请查看

在方法
中切换FullScreenMode()

实际上,如果鼠标触到侧面,会有更多的东西隐藏各种侧面板

还要注意,必须显式设置边界
Window.setExtendedState(MAXIMIZED_BOTH)
在dispose()附近会造成严重干扰,因为它们都依赖于操作系统的多个本机事件,如果在那一瞬间无法显示窗口,这些事件就会丢失

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

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
使用屏幕,您的JFrame当前处于:

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);
虽然它当前是相同的,但将来可能会更改。

调用
dispose()
释放本机窗口资源。然后可以编辑未装饰等属性。然后只需调用
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
}
尝试:


看看吧。希望这会有帮助

这是我考虑过的,但我正在寻找一个替代方案。这对我来说非常有效,而且是一个比定期创建新框架更简单的代码更改。您关于边界和使用框架当前屏幕的评论特别有用。在将窗口转到全屏之前,我还获得了窗口的边界,这使我可以在退出全屏时将其恢复到相同的位置和大小。调用
dispose()
释放本机窗口资源。然后可以编辑未装饰等属性。使用
pack()
可以重新创建窗口资源。然后只需调用
setVisible(true)
,一切正常(位置和所有成分都不会改变),正如Thomas所描述的,这是可能的,也可以看到它的神奇而简单的解决方案谢谢你这么多我做了这个处理();“未装饰的设置(正确);setExtendedState(JFrame.MAXIMIZED_两者);设置可见(真);'这应该是可以接受的答案,因为它不会每次都创建一个新的JFrame。
dispose();
setUndecorated(true/false);
setVisible(true);
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
}
dispose();
setUndecorated(true);
setVisible(true);