首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Odd pack()行为

Java Odd pack()行为
EN

Stack Overflow用户
提问于 2013-02-21 02:49:46
回答 1查看 166关注 0票数 3

我的主要问题是在设置JFrame时使用以下代码:

代码语言:javascript
复制
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语句,我们得到了错误的面板尺寸:

代码语言:javascript
复制
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]

我发现,将相关代码修改为以下代码可以解决此问题:

代码语言:javascript
复制
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语句):

代码语言:javascript
复制
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个像素的来源。有人知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-21 03:28:55

JFrame派生自Frame,在setResizable(...)的Frame源代码中,您将看到以下注释:

代码语言:javascript
复制
    // 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()是很有意义的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14987646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档