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

imm*_*art 16 java swing window

我有一个奇怪的问题.我正在使用窗口的null布局(= 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());
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?为什么窗口会调整大小?

更新:同样的事情(使用和不使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*let 13

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

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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑/ UPDATE:

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

  • @Guillaume Polet对不起,这是一个非常糟糕但我在试图解决这个问题时遇到了这个问题.解决方案是使用:getContentPane().setPreferredSize(new Dimension(600,400)); 的setResizable(假); 包(); 按顺序,所以你必须在setResizable(false)之后调用pack.你可以添加它,以便其他人可以更快地获得解决方案吗?谢谢! (2认同)

小智 5

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