如何在JFrame中移除标题栏

29

我正在使用以下代码进行练习,

http://docs.oracle.com/javase/tutorial/uiswing/examples/layout/BorderLayoutDemoProject/src/layout/BorderLayoutDemo.java

我还添加了:

frame.setSize(frame.getMaximumSize());

在createAndShowGUI()方法中,

我想让这个窗口没有标题栏、关闭和最小化按钮。

我尝试了以下代码,

frame.setUndecorated(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
如果我在pack()之前添加此代码,它会进入无限循环,并出现以下异常:Exception in thread "AWT-EventQueue-0" java.lang.NegativeArraySizeException
如果我将createAndShowGUI()方法的最后一行添加进去,它会抛出Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is displayable. 我该怎么办?
谢谢。
2个回答

46

通过在FrameJFrame实例上调用setUndecorated(true)方法,即将“undecorated”属性设置为true,可以移除标题栏。这将同时移除标题栏周围的框架。

下面是问题所需的代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Already there
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true); // <-- the title bar is removed here

在一个充满内容的 JFrame

必须在调用 pack() 之前调用 setUndecorated(true),无论是直接调用还是间接调用,例如通过 setVisible(true)

显然,在执行打包操作后无法删除标题栏,这是 Frame#setDecorated(boolean) 的文档:

可以使用 setUndecorated 关闭帧的本地装饰(即帧和标题栏)。这只能在帧不可显示时完成。如果帧是可显示的,则该方法将抛出运行时异常: IllegalComponentStateException

然而,可以在 FrameJFrame 上调用 Window#dispose() 然后再次打包,这会导致 JFrame 中组件的布局被刷新。


4
只有在您希望最大化框架时,此方法才有效。如果不是,请确保在打包框架之前设置setUndecorated(true)。 - Erick Robertson

7

好的,下面这段代码片段在createAndShowGUI()中对我很有用:

JFrame frame = new JFrame("BorderLayoutDemo");
frame.setUndecorated(true); // Remove title bar
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentsToPane(frame.getContentPane());
frame.pack();
frame.setVisible(true);

请注意,我不确定您试图通过手动将未实现的框架大小设置为其最大大小(最初将为(0, 0))来实现什么目标。


是的,没错,谢谢!在我删除setSize之后,它起作用了。但是我不知道应该如何将JFrame实例的大小设置为(0, 0)? - CanCeylan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接