【发布时间】:2018-03-29 23:32:43
【问题描述】:
我在使用最新社区版 IntelliJ 开发的 Windows 机器上使用 Java8。为了使 JFrame 全屏显示,我找到了以下解决方案,其中我遇到了一种我想要验证的不同行为。
我从JFrame full screen得到的解决方案
根据解决方案,我需要在下面添加三行以使 JFrame 全屏显示:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
但在我的项目中,我创建了一个扩展 JFrame 的类 AppFrame.java。在默认构造函数中,我设置了一些基本属性,如字体等,重要的是可见性为 true。
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);从我的班级中取出并将 setVisible 放回 AppFrame 中。异常消失了。还有frame.setUndecorated(true);我相信会删除JFrame的标题栏。
另外,下面是 JFrame 的 javadoc 的摘录:
框架可能有其原生装饰(即框架和标题栏) 用 setUndecorated 关闭。这只能在框架时完成 无法显示。
如果有人可以验证这种行为,那就太好了。
【问题讨论】:
-
我不确定您希望我们验证什么,文档很清楚
-
" 我从 AppFrame.java 中删除了 setVisible (true)" - 我认为这是一件好事,因为它不应该取决于
AppFrame要确定何时应该使其可见,这是最好留给子类的实现细节 -
如果想最大化一个窗口,可以使用
setExtendedState
标签: java swing jframe fullscreen maximize-window