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

时间:2012-10-03 15:32:23

标签: java swing layout 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);
}
}

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

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

我做错了什么?

5 个答案:

答案 0 :(得分:5)

  1. 如果您希望内容窗格精确地为400x400,那么我会考虑将其preferredSize设置为400x400(虽然我不想在内容窗格上强制使用首选大小,但在某些情况下可能是可接受的)。
  2. 设置首选尺寸后,在显示框架之前,请在框架上调用pack()
  3. 这是最简洁,最简单的解决方案,您不必关心边界插入。

答案 1 :(得分: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);
   }
}

或者更好:

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);
   }
}

正如其他海报所述,你必须在顶级窗口使用pack()并使用布局管理器。

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

答案 2 :(得分:2)

  1. 在面板中制作你的ui。
  2. 设置面板的首选大小。
  3. 将面板添加到框架并调用pack()

答案 3 :(得分:2)

你误解了你正在使用的东西,所以它似乎“错误”。

内嵌不是内容窗格之外的“内容”的维度。它们类似于内容窗格周围的“边框”,不允许绘图。与边界不同,插图不重叠。

窗口周围的装饰大小不是由程序决定的。它由处理焦点和窗口导航的不同程序决定。该程序称为窗口管理器。窗口管理器处理“顶部的标题栏”,它的高度,字体等。

要获得“精确大小”程序,您需要向窗口管理器询问无框架窗口,该窗口可以用Java完成。它顶部不会有标题栏,也不会在边缘附近调整大小句柄,窗口命令菜单,关闭的红色“x”或者在桌面上移动窗口的方法(尽管你的程序可以重新定位自己如果这样写的话)。

另一种方法是在适当的尺寸和根窗格窗口中请求独占“屏幕”,这有时是通过游戏完成的。这是一种限制性更强的处理方式,分辨率仅限于支持的屏幕尺寸。

如果您确实希望内容窗格是特定大小,而不是整个窗口是特定大小,请查看处理内容窗格首选大小的其他优秀答案。

答案 4 :(得分:0)

  • BorderLayoutJFrame API中已预先实现)忽略Insets

  • 大部分LayoutManager也忽略了Insets,只有AbsoluteLayout

  • 才需要

基本和常见的东西

  • JFrame(大多数Containers)只能返回InsetsBoundsSize

    a)来自已经可见的容器

    b)致电JFrame(e.i.)#pack()

  • 之后
  • 然后在大多数情况下设置InsetsBoundsSizeXxxSize而不是反效果,因为

    a)大多数JComponents可以向其父级返回自己的PreferredSize

  • 但不包括

    a)Graphics(2D)

    b)空容器

    c)JScrollPane& JList / JTable,如果JScrollPane可以使用其容器重新调整大小,则生成自己的代码monstrum会产生相反的效果