我在使用最新社区版 IntelliJ 开发的 Windows 机器上使用 Java8。为了使 JFrame 全屏显示,我在下面的解决方案中找到了我想要验证的一种不同行为。
根据解决方案,我需要在下面添加三行以使 JFrame 全屏显示:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
但在我的项目中,我创建了一个扩展 JFrame 的类 AppFrame.java。在默认构造函数中,我设置了一些基本属性,如字体等,重要的是可见性为真。
import javax.swing.*;
import java.awt.*;
public class AppFrame extends JFrame {
AppFrame() {
Font baseFont = new Font("Dialog", Font.PLAIN, 12);
setFont(baseFont);
setLocationRelativeTo(null);
setBackground(Color.WHITE);
setForeground(Color.black);
setLayout(new FlowLayout());
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
在扩展 AppFrame 的类中,当我尝试将以上三行(有或没有 setVisible,它已经来自 AppFrame)最大化时,它得到以下错误:
Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
作为解决方案的一部分(我想验证) - 实验上我从 AppFrame.java 中删除了 setVisible (true) 并且它有效,但这会影响所有扩展 AppFrame 的类,所以我frame.setUndecorated(true);
也从我的类中删除并放回AppFrame 中的 setVisible。异常消失了。我也frame.setUndecorated(true);
相信删除 JFrame 的标题栏。
此外,以下是 JFrame 的 javadoc 的摘录:
框架可以使用 setUndecorated 关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时完成。
如果有人可以验证这种行为,那就太好了。