我在Windows机器上使用Java8开发最新的IntelliJ社区版。为了使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);
}
}
在我尝试将三行以上(有或没有setVisible,已经来自AppFrame)扩展到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。这只能在框架中完成 无法显示。
如果有人可以验证此行为,那就太好了。
答案 0 :(得分:0)
按照设计,您必须在setUndecorated
之前和之前调用setVisible
。所以你别无选择,只能从setVisible
的基类调用中删除,并在每次子类中调用它。
答案 1 :(得分:0)
修改初始化程序以使用参数。
AppFrame() {
应更改为AppFrame(boolean undecorated, boolean visible) {
,然后在初始化工具中添加setUndecorated(undecorated);
和setVisible(visible);
已完成的解决方案:
import javax.swing.*;
import java.awt.*;
public class AppFrame extends JFrame {
AppFrame(boolean undecorated, boolean visible) {
Font baseFont = new Font("Dialog", Font.PLAIN, 12);
setFont(baseFont);
setLocationRelativeTo(null);
setBackground(Color.WHITE);
setForeground(Color.black);
setLayout(new FlowLayout());
setExtendedState(JFrame.MAXIMIZED_BOTH);
setUndecorated(undecorated);
setVisible(visible);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
关于:
框架可以使用setUndecorated关闭其原生装饰(即Frame和Titlebar)。这只能在帧不可显示时完成。
这只是说明在调用setVisible(true);
之前必须这样做。要确定您是否可以安全地致电setUndecorated
,可以使用if (!isDisplayable()) { ... }