我的主要问题是在设置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);
}
使用以下打印语句,我们会收到面板的错误尺寸:
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);
}
这会为我们的面板生成正确的尺寸(使用与之前相同的打印声明):
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个像素来自哪里。 有人知道为什么会这样吗?
答案 0 :(得分:6)
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().
因此,在调用pack()
之后调用setResizable(false)
是有意义的。