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

前端之家收集整理的这篇文章主要介绍了Java如何使JFrame最大化但不可调整大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最初(参见我之前的问题“Java how to make JFrames start off as a maximised window”)我想创建一个最大化的窗口.
代码完成此操作:

public static void main(String[] args)  {

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

}

但是,如果此窗口恢复,它将成为一个几乎不存在的栏.为了解决这个问题,我使用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);

}

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

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

最佳答案
有一个简单的修复几乎一直在工作:在设置可见之后使框架不可调整.所以只能这样修改你的代码

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);

}

这样,框架将开始最大化,并且最大化按钮将变灰,从而阻止用户使用它. (我真的不知道为什么你必须这样做.我认为最大化的状态实际上只在窗口变得可见时应用,如果你之前使它不可调整,它将不适用.)

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

现在,几乎没有理由做这种事情.用户并不喜欢当你阻止他们操纵他们的窗户时(例如,最大化的窗口不能被移动,并且当你有多个屏幕时这会很烦人).例外情况是你正在制作一款通常是全屏的游戏.但是你不会想要一个JFrame,因为你不想要所有的装饰,而是一个Window.

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

最后,最后一句话.我将我的示例代码作为快捷方式放在main方法中,但是你应该总是使用SwingUtils.invokeLater()在Swing EDT中做Swing的东西.

猜你在找的Java相关文章