我有一个奇怪的问题。我正在使用窗口的null布局(= JFrame和Windows),如果我使用setResizable(false),窗口大小会变大(向右和向下,我会说大约10个像素)。我不知道为什么。
两张相同尺寸的纸张返回相同的尺寸,这也很奇怪......
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);
}
}
答案 0 :(得分: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();
}
});
}
}
EDIT / UPDATE:
将resizable设置为false(至少在Windows 7和JDK 6上),以某种方式插入不正确。不知何故,它们从30,8,8,8变为25,3,3,3,尽管边界(由操作系统绘制)实际上保持不变。由于insets是Frame的边界的一部分,因此当它不可调整大小时,框架实际上太大(视觉上)。对我来说,当帧不可调整大小时,计算出的insets中似乎存在一个错误。
答案 1 :(得分:5)
如果在设置边界之前设置setResizable为false,则不会出现问题。正如Gergely Szilagyi之前所说,你正在摆脱滚动条,但窗口的大小是锁定的,因此你最终会在框架中增加9或10像素的额外空间。我刚遇到同样的问题。谢谢你的帮助。
答案 2 :(得分:1)
根据L& F设置,resizable(false / true)可能会改变窗口边框的装饰。没有最大化,没有调整大小箭头。这本身就可以改变规模。
答案 3 :(得分:1)
替换:
frame.setResizable(false);
为:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setResizable(false);
}
});
答案 4 :(得分:1)
嗯,我遇到了这个问题,这是一个Look&感觉问题......
为什么可调整大小的框架具有(5,5,5,5)的插图?它让我认为使其可调整大小会在框架周围添加一些额外的组件,比如...某种"处理程序"拖动以调整大小?
然后我发现如果我们使用默认的Java Metal l& f并设置setDefaultLookAndFeelDecorated(true)
,处理程序将被绘制,因此框架不会改变大小。但是在Nimbus,Motif和Windows L& F这一点没有实现,所以它是一个bug。我会报告。
我自己的问题和我对GIF的回答是:
Swing - setResizable(true) make JFrame title bar higher and window size smaller
答案 5 :(得分:0)
到目前为止,针对此烦人问题的最佳补丁如下。在哪里调用setResizable(false)
方法无关紧要。只需在setVisible(true)
之后添加这段代码。
private void sizeBugPatch() {
while (frame.getWidth() > yourWidth) {
frame.pack();
}
}
yourWidth
是 width ,您可以手动或通过覆盖setPreferredSize
方法以任何可能的方式设置。解释非常简单,frame.pack()
似乎以某种方式重置frame.setResizable(boolean b)
。您可以使用if
代替while
循环,但我更喜欢while
来排除即使在第二个pack()
之后窗口仍然是超大的情况。
答案 6 :(得分:0)
我定义了2个JFrame子类。如果我在独立应用程序中运行问题框架,则框架大小是正确的。如果我在独立应用程序中运行两个帧,问题框架仍然更大。我在打包之前做了setResizable(false),但我仍然遇到了问题。我的解决方法是将布局更改为BorderLayout并将(图像)面板放在中心,然后执行setResizable。