当前位置: 首页 > 知识库问答 >
问题:

JFrame在全屏没有未装饰

刘奇
2023-03-14

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

我从JFrame全屏中获取的解决方案

根据解决方案,我需要在下面三行使JFrame全屏:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);

但在我的项目中,我创建了一个类AppFrame。扩展JFrame的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中删除了setVisible(true)。java和它的工作,但这将影响所有扩展AppFrame的类,所以我删除了框架。未装饰(真) 以及我的类,并将setVisible放回AppFrame。例外消失了。还有帧。未装饰(真) 我相信删除了JFrame的标题栏。

此外,以下是JFrame的javadoc摘录:

框架可以使用SetUndercorated关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时进行。

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

共有2个答案

范福
2023-03-14

修改初始值设定项以使用参数AppFrame(){应更改为AppFrame(boolean Undercorated,boolean visible){然后在初始值设定项中添加SetUndercorated(Undercorated);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);
    }
}

关于:

框架可以使用SetUndercorated关闭其原生装饰(即框架和标题栏)。这只能在框架不可显示时进行。

这只是说明在调用setVisible(true)之前必须这样做 。为了确定是否可以安全地调用setUndercorated,可以使用if(!isDisplayable()){…}

耿俊彦
2023-03-14

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

 类似资料:
  • 问题内容: 我将很快进行一个项目,并且必须在其中使用全屏模式。 它将在窗口中绘制一些图形。如果我使用JFrame或类似的东西,那会很方便。 我不知道屏幕的最终分辨率是多少。请告诉我图形是否会自动缩放? 问题答案:

  • 我将很快做一个项目,我将不得不在它使用全屏模式。 它会在窗口中绘制一些图形。如果我使用JFrame或类似的东西会很方便。 我不知道屏幕的最终分辨率会是多少。请告诉我图形是否会自动重新缩放?

  • 我一直在使用此代码手动将屏幕设置为我的显示器像素尺寸: 我想找到一种方法,将JFrame设置为在任何显示器上全屏显示,但考虑到我的“Game”类包含其他方法和变量,我无法将其从这个启动程序代码中删除。

  • 所以我在玩JPanel和JFrames,我注意到我创建的JPanel在添加到Jframe对象时没有显示。注意,当我在Jframe构造函数中创建了一个JPanel,并在将其添加到Jframe之前提供了JPanel参数时,它起了作用。然而,现在我使用的是我创建的JPanel对象,它不再工作了。这就是我所做的。 编辑:事实上,我想我发现了错误。JPanel有它的绘制方法,当删除时,它允许Jframe显示

  • 问题内容: 有没有一种使用HTML5 标签全屏播放视频的方法? 如果这不可能,那么有人知道这样做的理由吗? 问题答案: HTML5没有提供将视频全屏显示的方法,但是并行的全屏规范提供了允许将任意元素(包括元素)全屏显示的方法。 它在许多浏览器中都具有实验性支持。 原始答案: 根据HTML5规范(撰写本文时:09年6月): 用户代理不应提供公共API来使视频全屏显示。脚本与精心制作的视频文件结合在一

  • 我想知道如何在JFrame中更改屏幕。例如,从起始屏幕更改为不同的屏幕。因此,在一个屏幕上有各种按钮、标签、树等,当用户单击按钮时,会出现不同的布局。 “setVisible(false)和setVisible(true)”会起作用吗?