在我的 Swing 应用程序中,我希望能够在装饰和未装饰之间切换,而无需重新创建整个框架。但是,API 不允许我setUndecorated()
在框架可见后调用。
即使我打电话setVisible(false)
,isDisplayable()
仍然返回真。API 说,使框架不可显示的唯一方法是重新创建它。但是,我不想仅仅为了关闭一些标题栏而重新创建框架。
我正在制作一个可以在全屏和窗口模式之间切换的全屏应用程序;它应该能够在保持状态等的同时进行切换。
可见帧后如何执行此操作?
在我的 Swing 应用程序中,我希望能够在装饰和未装饰之间切换,而无需重新创建整个框架。但是,API 不允许我setUndecorated()
在框架可见后调用。
即使我打电话setVisible(false)
,isDisplayable()
仍然返回真。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 中,面板(实际上是组件的任何实例)一次只能在一个框架中,因此当您将其添加到新框架中时,它会立即停止在旧框架中。
在方法中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);
虽然现在是一样的,但将来可能会改变。
调用dispose()
释放本机窗口资源。然后您可以编辑未装饰等属性。然后只需调用setVisible(true)
重新创建窗口资源,一切正常(位置和所有组件都不会改变)
dispose();
setUndecorated(true/false);
setVisible(true);
尝试:
dispose();
setUndecorated(true);
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
}