全屏显示JFrame,无需修饰 [英] JFrame in full screen without undecorated

查看:103
本文介绍了全屏显示JFrame,无需修饰的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using Java8 on Windows machine developing with latest community edition of IntelliJ. To make JFrame full screen I find below solution where I faced one different behavior which I want to get verified.

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

根据解决方案,我需要在下面三行输入内容,以使JFrame全屏显示:

As per the solution I need to put three below lines to make JFrame full screen:

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

但是在我的项目中,我创建了一个扩展JFrame的类AppFrame.java.在默认的构造函数中,我设置了一些基本属性,例如font等,重要的是将可见性设置为true.

But in my project I have created a class AppFrame.java that extends JFrame. And in default constructor I set some basic properties like font etc and importantly visibility to 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)以最大化它时,出现以下错误:

And in class that extends AppFrame when I try to put above three lines (with or without setVisible, which is already coming from AppFrame) to maximize it get below error:

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的标题栏.

As a part of solution (which I want to verify) - Experimentally I removed setVisible (true) from AppFrame.java and it worked, but this would be gonna impact all classes extending AppFrame, so I removed frame.setUndecorated(true); as well from my class and put back setVisible in AppFrame. And exception is gone. Also frame.setUndecorated(true); I believe removes title bar of JFrame.

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

Also, below is excerpt from javadoc of JFrame:

框架可能具有其原始装饰(即框架和标题栏) 使用setUndecorated关闭.这只能在框架 无法显示.

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

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

It would be great if someone can verify this behavior.

推荐答案

修改初始化程序以使用参数. AppFrame() {应该更改为AppFrame(boolean undecorated, boolean visible) {,然后在初始化程序中添加setUndecorated(undecorated);setVisible(visible);

Modify the initializer to use parameters. AppFrame() { should be changed to AppFrame(boolean undecorated, boolean visible) { then in the initializer add setUndecorated(undecorated); and 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关闭其本机装饰(即,框架和标题栏).这只能在框架无法显示时完成.

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

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

This is just stating that you have to do this before calling setVisible(true);. To determine if you can call setUndecorated safely, you can use if (!isDisplayable()) { ... }

这篇关于全屏显示JFrame,无需修饰的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆