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.
这将是巨大的,如果有人可以验证此行为。
通过设计,您必须在setVisible
之前且仅在setVisible
之前调用setUndecorated
。所以你别无选择,只能从基类调用setVisible
中删除,并且每次都在子类中调用它。
也是正常的做法(?)在invokeLater的构造函数外部调用setVisible。 –
“没有其他选择”是一个不准确的陈述,正如我的答案所强调的那样。在任何编程语言(包括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()) { ... }
我不确定您希望我们验证什么,文档非常清晰 – MadProgrammer
*“我从AppFrame.java中删除了setVisible(true)”* - I会认为这是一件好事,因为它不应该由'AppFrame'来决定应该何时显示它,这是一个最好留给子类的实现细节 – MadProgrammer
如果你想最大化一个窗口,你可以使用['setExtendedState'](https://docs.oracle.com/javase/8/docs/api/java/awt/Frame.html#setExtendedState-int-) – MadProgrammer