3

所以我对 GUI 很陌生,遇到了一个问题,即无论我将首选大小设置为 ( via setPreferredSize(new Dimension(width, height))),它都会增加10宽度和高度。我想知道,为什么会发生这种情况?是的,我知道这是“首选尺寸”,但肯定有办法防止这种情况发生。10在将它传递给方法之前,我可以通过简单地减去宽度和高度来修复它,但我想知道发生了什么。

我的(相关)代码:

主要方法:

 public static void main(String[] args)
 {
    final App app = new App(500, 500);

    JFrame frame = new JFrame("Block Stacker 3000");
    frame.getContentPane().add(app);
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    System.out.println(app.getSize());
    app.start();
 }

应用构造函数(扩展 JPanel):

  public App(int width, int height)
  { 
     this.width = width;
     this.height = height;

     System.out.println(width + " " + height);

     setPreferredSize(new Dimension(width , height));

     setBackground(Color.CYAN);
  }

运行时,它会输出以下内容:

500 500
java.awt.Dimension[width=510,height=510]

另外,我尝试过使用setMinimumSize()setMaximumSize()但都没有真正影响任何东西。

4

3 回答 3

3

您的大小JPanel将由处理其容器中组件的布局管理器确定。 JFrame有一个默认的布局管理器,所以即使你没有设置它也有一个。一些布局管理器关注首选尺寸,有些不关注,有些人比其他人更关注最小/最大尺寸。

您可以设置“空布局管理器”,也称为“绝对定位”,并自己控制所有尺寸,但我认为您不会尝试这样做(因为您正在设置“首选”尺寸)。设计 UI 所需要做的就是弄清楚你希望事物具有的相对大小和位置,以及当窗口大小发生变化时你希望它们发生什么;这决定了哪些布局管理器进入和进入哪些容器面板以及包含它们的容器面板等。

而且我不会消除frame.pack();它本质上告诉布局管理器做它的事情,一旦你按照你想要的方式设置它们,你通常希望布局管理器处理事情......

于 2013-01-04T04:22:15.863 回答
2

我复制/粘贴了您的代码并得到以下输出:

500 500
java.awt.Dimension[width=510,height=530]

但随后,我截取了框架的屏幕截图:

在此处输入图像描述

如果你下载图片并检查文件属性,你会看到它是 502 像素宽(由于窗口 1 像素细边框)和 531 像素高(由于窗口标题栏 31 像素高),检查图像gimp,我发现青色区域实际上是500x500像素宽。

更新:setResizable(false)句子移到后面的行 frame.setVisible(true);

    JFrame frame = new JFrame("Block Stacker 3000");
    frame.getContentPane().add(app);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(false);

之后,它将打印:

500 500
java.awt.Dimension[width=500,height=500]
于 2013-01-04T04:28:59.463 回答
0

您必须在调用pack() 调用setResizable(false),因为当窗口可调整大小时,布局管理器将为(潜在的)滚动条留出 10px 的边距。

public static void main(String[] args) {
    final App app = new App(500, 500);

    JFrame frame = new JFrame("Block Stacker 3000");
    frame.getContentPane().add(app);
    frame.setResizable(false);
    frame.pack();

    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    System.out.println(app.getSize());
    app.start();
 }
于 2014-09-24T20:12:47.913 回答