Java如何使JFrames最大化但不可resize

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

public static void main(String[] args) { JFrame frame = new JFrame(); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } 

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

为了解决这个问题,我设置了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); } 

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

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

有一个简单的修复几乎一直有效: 设置可见之后使框架不可调整。 所以只能这样修改你的代码:

 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。

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

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

有时,您必须小心设置JFrame参数的顺序。

此外,您应该在事件派发线程上使用Swing组件。

试试这个,看看它是否有帮助。

 public static void main(String[] args) { final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame("Jedia"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(screenSize); frame.setResizable(false); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } }); } 

你在运行什么环境? 我在Win7下使用JDK1.6 / JDK1.7尝试了这个,它按预期工作(窗口启动最大化,最小化到任务栏)。

我有一种可能有用的黑客攻击。 试试这个代码(它对我有用):

 public static void main(String[] args) { final JFrame frame = new JFrame("Jedia"); frame.setMinimumSize(new Dimension(600, 400)); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); frame.addComponentListener(new ComponentListener(){ @Override public void componentHidden(ComponentEvent e) { // TODO Auto-generated method stub } @Override public void componentMoved(ComponentEvent e) { // TODO Auto-generated method stub } @Override public void componentResized(ComponentEvent e) { if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8")) frame.setSize(new Dimension(600, 400)); } @Override public void componentShown(ComponentEvent e) { // TODO Auto-generated method stub } }); } 

当执行恢复操作时, e.paramString()返回一个看起来像“COMPONENT_RESIZED(-8,-8,[screensize])”的String。