【问题标题】:How to call setUndecorated() after a frame is made visible?如何在框架可见后调用 setUndecorated()?
【发布时间】:2010-10-26 21:13:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java swing fullscreen


    【解决方案1】:

    试试:

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

    检查一下。希望对您有所帮助!!

    【讨论】:

      【解决方案2】:

      您是否尝试过拨打Frame.dispose() 然后更改它?自己没有尝试过,但它可能会起作用。

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

      【讨论】:

      • 它惊人而简单的解决方案非常感谢我做了这个 dispose(); 'setUndecorated(true); setExtendedState(JFrame.MAXIMIZED_BOTH); setVisible(true);'
      • 这应该是公认的答案,因为它不会每次都创建一个新的 JFrame。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        虽然现在是一样的,但将来可能会改变。

        【讨论】:

        • 这对我来说非常有效,并且比定期创建新框架更简单的代码更改。您的 cmets 关于边界和使用框架的当前屏幕特别有帮助。在将其切换为全屏之前,我还获得了窗口的边界,这让我可以在退出全屏时将其恢复到相同的位置和大小。
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          你不能。当我试图达到同样的目标时,这就是我的经验。

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

          【讨论】:

          • 调用dispose() 释放本机窗口资源。然后您可以编辑未装饰等属性。使用pack() 重新创建窗口资源。然后只需致电setVisible(true),一切正常(位置和所有组件都不会改变)
          • 正如 Thomas 所述,这是可能的,另请参阅 stackoverflow.com/questions/27715638/…
          【解决方案7】:

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

          【讨论】:

          • 这是我考虑过的,但我正在寻找替代方案。
          猜你喜欢
          • 2014-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-30
          • 1970-01-01
          • 2022-08-05
          • 2022-06-09
          相关资源
          最近更新 更多