首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在框架可见后调用setUndecorated()?

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

Stack Overflow用户
提问于 2009-05-17 18:17:18
回答 6查看 48.8K关注 0票数 21

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

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-18 09:52:03

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

但是,如果您将整个UI放在框架中的一个面板中,则可以创建一个新框架并将该面板添加到框架中。没那么多工作要做。

如下所示:

代码语言:javascript
复制
// 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中,面板(实际上是组件的任何实例)一次只能位于一个框架中,因此当您将其添加到新框架中时,它会立即停止位于旧框架中。

票数 18
EN

Stack Overflow用户

发布于 2009-05-17 19:38:52

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

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

票数 29
EN

Stack Overflow用户

发布于 2009-07-30 11:50:10

看一看https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

在方法switchFullscreenMode()

代码语言:javascript
复制
dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

实际上,还有更多的东西在隐藏各种侧面板,如果鼠标触摸侧面板,这些侧面板就会重新出现。

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

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

代码语言:javascript
复制
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

而不是使用屏幕,您的JFrame当前处于打开状态:

代码语言:javascript
复制
setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/875132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档