我的主要问题是在设置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);
}使用下面的print语句,我们得到了错误的面板尺寸:
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]我发现,将相关代码修改为以下代码可以解决此问题:
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);
}这将为我们的面板生成正确的尺寸(使用与前面相同的print语句):
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个像素的来源。有人知道为什么会这样吗?
发布于 2013-02-21 03:28:55
JFrame派生自Frame,在setResizable(...)的Frame源代码中,您将看到以下注释:
// 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()是很有意义的。
https://stackoverflow.com/questions/14987646
复制相似问题