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

时间:2009-05-17 18:17:18

标签: java swing fullscreen

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

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

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

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

7 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:16)

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

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

答案 2 :(得分:13)

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

虽然目前情况相同,但未来可能会发生变化。

答案 3 :(得分:11)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

尝试:

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

检查出来。希望它会有所帮助!!

答案 6 :(得分:1)

以下是如何使 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
}