【问题标题】:JFrame in full screen without undecoratedJFrame全屏不加修饰
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 通常的做法 (?) 在 invokeLater 的构造函数之外调用 setVisible。
  • “别无选择”是一个不准确的陈述,正如我的回答所强调的那样。在任何编程语言中(包括 ASM)都不需要零参数初始化程序(据我所知)。
【解决方案2】:

修改初始化器以使用参数。 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 关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时完成。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多