Java setResizable(false)改变窗口大小(swing)

我有一个奇怪的问题。 我正在使用窗口的空布局(= JFrame和Windows),如果我使用setResizable(false),窗口大小会变大(到右边和底部,我会说大约10个像素)。 我不知道为什么。

两个println返回相同的尺寸,有什么奇怪的,也……

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWnd.setTitle(wndTitle); mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight); System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); mainWnd.setResizable(false); System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 

有人有想法吗? 为什么窗口会resize?

更新:同样的事情(使用和不使用setResizable编译它,如果你重叠窗口,你可以看到它):

 import javax.swing.JFrame; import javax.swing.JPanel; public class Main { private static JFrame mainWnd = null; public static void main(String[] args) { mainWnd = new JFrame(); mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWnd.setTitle("asda"); mainWnd.setBounds(50, 50, 300, 300); mainWnd.setResizable(false); mainWnd.setVisible(true); } } 

它在我的示例中没有变化,因此您必须有其他原因导致您的问题:

 import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Test4 { protected static void initUI() { JFrame frame = new JFrame("test"); frame.setBounds(0, 0, 300, 200); frame.setVisible(true); System.err.println(frame.getSize()); frame.setResizable(false); System.err.println(frame.getSize()); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initUI(); } }); } } 

编辑/ UPDATE:

将resizable设置为false(至少在Windows 7和JDK 6上)时,以某种方式插入不正确。 不知何故,它们从30,8,8,8变为25,3,3,3,尽管边界(由操作系统绘制)实际上保持不变。 由于insets是Frame的边界的一部分,因此当它不可resize时,框架实际上太大(视觉上)。 对我来说,当帧不可resize时,计算的insets中存在一个错误。

如果在设置边界之前设置setResizable为false,则不会出现问题。 正如Gergely Szilagyi之前所说,你正在摆脱滚动条,但窗口的大小是锁定的,因此你最终会在框架中增加9或10像素的额外空间。 我刚遇到同样的问题。 谢谢您的帮助。

根据L&F设置,可resize(false / true)可能会更改窗口边框装饰。 没有最大化,没有resize箭头。 这本身可以改变大小。

更换:

 frame.setResizable(false); 

至:

  SwingUtilities.invokeLater(new Runnable() { public void run() { frame.setResizable(false); } }); 

好吧,我遇到了这个问题,这是一个外观问题……

为什么可resize的框架具有(5,5,5,5)的插图? 它让我觉得让它可resize会在框架周围添加一些额外的组件,比如…某种“处理程序”来拖动resize

然后我发现如果我们使用默认的Java Metal l&f并设置setDefaultLookAndFeelDecorated(true) ,那么处理程序将被绘制,因此框架不会改变大小。 但是在Nimbus,Motif和Windows L&F这一点没有实现,所以这是一个bug。 我会举报。

我自己的问题和我对GIF的回答如下:

Swing – setResizable(true)使JFrame标题栏更高,窗口大小更小

到目前为止,针对这个恼人问题的最佳补丁如下。 无论你在哪里调用setResizable(false)方法。 只需在setVisible(true)后添加这段代码即可。

 private void sizeBugPatch() { while (frame.getWidth() > yourWidth) { frame.pack(); } } 

其中yourWidth是您以任何可能的方式设置的宽度 ,可以手动或通过覆盖setPreferredSize方法。 解释很简单, frame.pack()似乎以某种方式重置了frame.setResizable(boolean b) 。 您可以使用if而不是while循环,但我更喜欢while排除情况下,即使在第二个pack()之后窗口仍然是超大的。

我定义了2个JFrame子类。 如果我在独立应用程序中运行问题框架,则框架大小正确。 如果我在独立应用程序中运行两个帧,问题框架仍然更大。 我在打包之前做了setResizable(false),但我仍然遇到了问题。 我的解决方法是将布局更改为BorderLayout并将(图像)面板放在中心,然后执行setResizable。