17

我有一个奇怪的问题。我正在为窗口使用空布局(= JFrame 和在窗口上),如果我使用 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());

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

更新:同样的事情(编译它有和没有 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);
    }
}
4

7 回答 7

14

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

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

编辑/更新:

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

于 2012-06-27T11:33:55.803 回答
6

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

于 2014-02-02T17:22:20.300 回答
1

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

于 2012-06-27T11:44:58.963 回答
1

代替:

frame.setResizable(false);

到:

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            frame.setResizable(false);
        }
    });
于 2013-08-11T21:30:53.543 回答
1

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

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

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

我自己的问题和我对 GIF 的回答在这里:

Swing - setResizable(true) 使 JFrame 标题栏更高,窗口尺寸更小

于 2017-06-01T17:19:46.040 回答
0

到目前为止,解决这个烦人问题的最佳补丁如下。调用方法的位置无关紧要setResizable(false)。只需在您之后添加这段代码setVisible(true)

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

您以任何可能的方式设置yourWidth宽度在哪里,无论是手动还是通过覆盖setPreferredSize方法。解释很简单,frame.pack()似乎以frame.setResizable(boolean b)某种方式重置。您可以使用 anif而不是while循环,但我更愿意while排除即使在 second 之后窗口仍然会超大的情况pack()

于 2016-07-21T18:46:06.893 回答
0

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

于 2016-08-19T01:41:47.470 回答