Insets.top,left,bottom,right全部为零

lil*_*roo 2 java layout swing layout-manager insets

这是我用来实例化JFrame的代码示例:

public class TestFrame{
public static void main(String[] args){
    JFrame frame = new JFrame();
    Insets insets = frame.getInsets();
    frame.setSize(new Dimension(insets.right + insets.left + 400, insets.bottom + insets.top + 400));
    System.out.println(String.format("Top = %d \nBottom = %d \nLeft = %d \n Right
            = %d", insets.top, insets.bottom, insets.left, insets.right));

    frame.setResizable(false);
    frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)

框架显示正常,但所有插图似乎都等于零.我需要知道顶部标题栏的大小,因为我想要一个大小为400x400的内容窗格.

我在多个平台上进行了测试,同样的事情发生在Windows和Mac上.

我究竟做错了什么 ?

Gui*_*let 5

  1. 如果您希望内容窗格精确地为400x400,那么我会考虑将其preferredSize设置为400x400(虽然我不想强制首选大小,但在内容窗格中,在某些情况下可能是可接受的).
  2. 设置首选大小后,在显示框架之前,请调用pack()框架.

这是最干净,最简单的解决方案,您不必关心边界插入.


Hov*_*els 5

如果contentPane恰好是400 x 400,那么创建一个类,为其preferredSize返回该值并将其用作contentPane:

class MyContentPane extends JPanel {
   public static final int PREF_W = 400;
   public static final int PREF_H = 400;

   public Dimension getPreferredSize() {
     return new Dimension(PREF_W, PREF_H);
   }
}
Run Code Online (Sandbox Code Playgroud)

或者更好:

class MyContentPane extends JPanel {
   public int prefW;
   public int prefH;

public MyContentPane(int prefW, int prefH) {
   this.prefW = prefW;
   this.prefH = prefH;
}

   public Dimension getPreferredSize() {
     return new Dimension(prefW, prefH);
   }
}
Run Code Online (Sandbox Code Playgroud)

正如其他海报所提到的,你必须pack()在顶层窗口上使用并使用布局管理器.

我自己不喜欢这样做,而是让各种组件的实际首选大小和容器的布局管理器为我做出所有决定.