0

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

我从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 关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时完成。

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

4

2 回答 2

0

setUndecorated按照设计,您必须在之前且仅在之前调用setVisible。因此,您别无选择,只能从基类调用中删除 setVisible并每次在子类中调用它。

于 2017-10-18T08:55:12.730 回答
0

修改初始化程序以使用参数。 AppFrame() {应更改为AppFrame(boolean undecorated, boolean visible) {then 在初始化程序中添加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 关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时完成。

这只是说明您必须在调用之前执行此操作setVisible(true);。要确定您是否可以setUndecorated安全地调用,您可以使用if (!isDisplayable()) { ... }

于 2018-01-02T15:13:13.530 回答