Java Odd pack()行为 [英] Java Odd pack() Behavior
问题描述
我的主要问题是设置JFrame时的以下代码:
My main issue is with the following piece of code when setting up a JFrame:
public Frame(){
JPanel panel = new JPanel();
add(panel);
panel.setPreferredSize(new Dimension(200, 200));
pack(); // This is the relevant code
setResizable(false); // This is the relevant code
setVisible(true);
}
使用以下打印语句,我们会收到错误的面板尺寸:
With the following print statements we receive faulty dimensions for panel:
System.out.println("Frame: " + this.getInsets());
System.out.println("Frame: " + this.getSize());
System.out.println("Panel: " + panel.getInsets());
System.out.println("Panel: " + panel.getSize());
Output:
Frame: java.awt.Insets[top=25,left=3,bottom=3,right=3]
Frame: java.awt.Dimension[width=216,height=238]
Panel: java.awt.Insets[top=0,left=0,bottom=0,right=0]
Panel: java.awt.Dimension[width=210,height=210]
我发现将相关代码修改为以下内容可以解决此问题:
I have discovered that modifying the relevant code to the following fixes the issue:
public Frame(){
JPanel panel = new JPanel();
add(panel);
panel.setPreferredSize(new Dimension(200, 200));
setResizable(false); // Relevant code rearranged
pack(); // Relevant code rearranged
setVisible(true);
}
这将为我们的面板生成正确的尺寸(使用与之前相同的打印语句)
This produces the correct dimensions for our panel (using same print statements as earlier):
Frame: java.awt.Insets[top=25,left=3,bottom=3,right=3]
Frame: java.awt.Dimension[width=206,height=228]
Panel: java.awt.Insets[top=0,left=0,bottom=0,right=0]
Panel: java.awt.Dimension[width=200,height=200]
我浏览了一些文档,但找不到这10个像素来自何处. 有人知道为什么会这样吗?
I have looked through some documentation but could not find out where these 10 pixels come from. Does anybody know why exactly this is the case?
推荐答案
JFrame源自Frame,在setResizable(...)
的Frame源代码中,您将看到以下注释:
JFrame derives from Frame, and in the Frame source code for the setResizable(...)
you'll see this comment:
// On some platforms, changing the resizable state affects
// the insets of the Frame. If we could, we'd call invalidate()
// from the peer, but we need to guarantee that we're not holding
// the Frame lock when we call invalidate().
因此,在调用setResizable(false)
之后调用pack()
是有意义的.
Because of this, it makes sense to call pack()
after calling setResizable(false)
.
这篇关于Java Odd pack()行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!