最初(参见我之前的问题“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的东西.