JFrame在全屏幕没有undecorated

问题描述:

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

解决方案,我从JFrame full screen

了按照该解决方案,我需要放三线以下,使JFrame的全屏:

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

但在项目中,我创建了一个类AppFrame.java那扩展JFrame。而在默认的构造函数中,我设置了一些基本属性,如字体等,重要的是可见性为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的标题栏。

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

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.

这将是巨大的,如果有人可以验证此行为。

+2

我不确定您希望我们验证什么,文档非常清晰 – MadProgrammer

+2

*“我从AppFrame.java中删除了setVisible(true)”* - I会认为这是一件好事,因为它不应该由'AppFrame'来决定应该何时显示它,这是一个最好留给子类的实现细节 – MadProgrammer

+1

如果你想最大化一个窗口,你可以使用['setExtendedState'](https://docs.oracle.com/javase/8/docs/api/java/awt/Frame.html#setExtendedState-int-) – MadProgrammer

通过设计,您必须在setVisible之前且仅在setVisible之前调用setUndecorated。所以你别无选择,只能从基类调用setVisible中删除,并且每次都在子类中调用它。

+0

也是正常的做法(?)在invokeLater的构造函数外部调用setVisible。 –

+0

“没有其他选择”是一个不准确的陈述,正如我的答案所强调的那样。在任何编程语言(包括ASM)中,零参数初始化器都不是必需的(据我所知)。 – Wayne

修改初始值设定项以使用参数。 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); 
    } 
} 

在问候:

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