如何在 JFrame 中删除标题栏

2022-09-01 15:27:05

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

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() 之前添加了此代码,它将进入 infine 循环,并在线程 “AWT-EventQueue-0” java.lang.NegativeArraySizeException 中出现异常

如果我添加了 createAndShowGUI() 方法的最后一行,它会在线程 “AWT-EventQueue-0” java.awt.IllegalComponentStateException 中引发异常:帧是可显示的。

我该怎么办?

谢谢。


答案 1

标题栏可以通过在 或 实例上调用 setUndecorated(true) 来删除,即通过将 “undecrated” 属性设置为 .这将删除标题栏周围的框架。FrameJFrametrue

以下是问题所需的代码:

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

在打包的 JFrame 上

setUndecorated(true)必须在被直接或间接调用之前调用,例如通过 。pack()setVisible(true)

显然,在执行打包后无法删除标题栏,这是Frame#setDecorated(布尔值)的文档

框架的本机修饰(即框架和标题栏)可能在 时关闭。这只能在帧不可显示时完成。该方法将引发运行时异常:如果帧是可显示的。setUndecoratedIllegalComponentStateException

但是,您可以在 or 上调用 Window#dispose(),然后再次打包它,这会导致 刷新 中组件的布局。FrameJFrameJFrame


答案 2

好吧,下面的代码片段对我有用: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)


推荐