Java如何使JFrame最大化但不可调整大小

Jac*_*nor 5 java swing screen jframe dimension

最初(参见我之前的问题" Java如何使JFrames作为最大化窗口开始 ")我想创建一个最大化的窗口.此代码完成此操作:

public static void main(String[] args)  {

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);

}
Run Code Online (Sandbox Code Playgroud)

但是,如果此窗口恢复,它将成为一个几乎不存在的栏.为了解决这个问题,我使用setSize()为窗口设置了一个大小.这有效但存在另一个问题,窗口仍然可以调整大小.

为了解决这个问题,我设置了setResizable(false); 到目前为止这是我的代码:

public static void main(String[] args) {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    JFrame frame = new JFrame("Jedia");
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(screenSize);
    frame.setResizable(false);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
Run Code Online (Sandbox Code Playgroud)

但是,现在窗口以指定的大小(而不是最大化)开始,无法恢复.

所以,我的问题是,我怎样才能使窗口开始最大化,给它一个大小,以便它恢复时,并使其不可能重新调整大小?或者创建一个开始最大化并且无法恢复的窗口?

Cyr*_* Ka 3

有一个几乎始终有效的简单修复:使框架在设置可见后无法调整大小。所以只能这样修改你的代码:

public static void main(String[] args) {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    JFrame frame = new JFrame("Jedia");
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(screenSize);
    frame.setVisible(true);    // FIRST visible = true
    frame.setResizable(false); // THEN  resizable = false
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
Run Code Online (Sandbox Code Playgroud)

这样,框架将开始最大化,最大化按钮将变灰,阻止用户使用它。(我真的不知道为什么你必须这样做。我想只有当窗口变得可见时,最大化状态才真正应用,如果你之前使它不可调整大小,它就不会应用。)

几乎一直有效,因为在 Windows 7 上至少您可以通过单击标题栏并拖动它来使窗口退出最大化状态。但它会是你之前设置的大小。问题是您的用户将无法再次最大化它,并且我还没有找到侦听器使窗口恢复到最大化状态的方法。(编辑:@David Kroukamp 在他的答案的最后部分显示,可以通过使用 ComponentListener 强制最大化状态。因此您不必使用setResizable(false)这种方式,您在 Windows 7 中仍然存在问题,因为拖动操作无论出于何种原因,该事件都不会捕获,但用户将能够使用最大化按钮将其放回应有的位置。)

现在,几乎没有理由做这种事情。当您阻止用户操作其窗口时,用户并不真正喜欢(例如,最大化的窗口无法移动,当您有多个屏幕时,这可能会很烦人)。一个例外是,如果您正在制作游戏,通常是全屏的。但是这样您就不需要 JFrame,因为您不需要所有装饰,而是需要 Window。

如果您的问题是默认窗口尺寸非常小,这是正常的。您必须首先在框架中放置一些内容(一些控件、按钮、应用程序中您想要的内容),使用布局(这很重要),然后调用pack()框架上的方法。它将为您的窗口选择一个不错的默认大小。

最后,最后一句话。我已将示例代码main作为快捷方式放入方法中,但您应该始终使用SwingUtils.invokeLater().