有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

帧可见后如何执行此操作


共 (6) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    尝试:

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

    看看吧。希望这会有帮助

  3. # 3 楼答案

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

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

  4. # 4 楼答案

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

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

  5. # 5 楼答案

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

    dispose();
    setUndecorated(true/false);
    setVisible(true);
    
  6. # 6 楼答案

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

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