Java Odd pack() Behavior

时光怂恿深爱的人放手 提交于 2019-12-23 19:44:50

问题


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]

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?


回答1:


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().

Because of this, it makes sense to call pack() after calling setResizable(false).



来源:https://stackoverflow.com/questions/14987646/java-odd-pack-behavior

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!