全屏JFrame没有未修饰

时间:2017-10-18 06:51:21

标签: java swing jframe fullscreen maximize-window

我在Windows机器上使用Java8开发最新的IntelliJ社区版。为了使JFrame全屏显示,我在下面的解决方案中找到了一个我想要验证的不同行为。

我从JFrame full screen

获取的解决方案

根据解决方案,我需要在下面三行以使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。这只能在框架中完成   无法显示。

如果有人可以验证此行为,那就太好了。

2 个答案:

答案 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()) { ... }