Java Odd pack()行为

时间:2013-02-20 18:49:46

标签: java swing resize jframe

我的主要问题是在设置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个像素来自哪里。 有人知道为什么会这样吗?

1 个答案:

答案 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) 是有意义的。