Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插图:顶部、左侧、底部、右侧均为零_Java_Swing_Layout_Layout Manager_Insets - Fatal编程技术网

Java 插图:顶部、左侧、底部、右侧均为零

Java 插图:顶部、左侧、底部、右侧均为零,java,swing,layout,layout-manager,insets,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

这是我用来实例化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上

我做错了什么

<> LI>如果您希望您的内容窗格正好是400×400,那么我会考虑将其首选大小设置为400×400(虽然我不喜欢强制首选大小,在内容窗格上,在某些情况下,它可能是可接受的)。
  • 设置首选尺寸后,在显示框架之前,在框架上调用
    pack()

  • 这是最干净、最简单的解决方案,您不必关心边框插入。

    如果contentPane的大小正好为400 x 400,则创建一个类,根据其首选大小重新运行它,并将其用作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()
    ,并使用布局管理器

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

  • 在面板中创建ui
  • 设置面板的首选尺寸
  • 将面板添加到框架并调用
    pack()

  • 你误解了你的工作,所以这看起来是“错误的”

    插图不是内容窗格外部“内容”的维度。它们类似于内容窗格周围的“边框”,不允许在其中进行绘图。与边框不同,插图不重叠

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

    要获得一个“精确大小”的程序,您需要向窗口管理器请求一个无帧窗口,这可以用Java实现。它不会在顶部有标题栏,也不会在边缘附近有大小调整手柄、窗口命令菜单、要关闭的红色“x”或在桌面上移动窗口的方法(尽管程序可以重新定位自己,如果编写为这样做的话)

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

    如果您确实希望内容窗格具有特定的大小,而不是整个窗口具有特定的大小,请参考其他关于内容窗格首选大小的优秀答案。

    • BorderLayout
      (在
      JFrame API
      中预先实现)忽略
      插入项

    • 大多数
      LayoutManager
      也忽略
      Insets
      ,仅
      AbsoluteLayout
      需要

    基本和普通的东西

    • JFrame
      (以及大多数
      容器
      )只能返回
      插入项
      边界
      大小

      a) 从已经可见的容器

      b) 调用后
      JFrame(e.i.)#pack()

    • 在大多数情况下,设置
      插入
      边界
      大小
      XxxSize
      比设置相反更有效,因为

      a) 大多数
      JComponents
      可以将自己的和适当的
      PreferredSize
      返回给其父级

    • 但不包括

      a)
      图形(2D)

      b) 对于空容器

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


    +1,我们得出了相同的结论。虽然简单地设置首选大小也有效,并且不需要扩展JPanel。@纪尧姆:我同意,但我讨厌kleopatra/Jeanette因为设置首选大小而打我,所以我尝试通过方法重写来实现。我也讨厌;-)但在这种情况下,这似乎是解决问题的一种非常有效的方法。最后,结果是一样的,这才是最重要的:——)@guillaume:我自己喜欢的方法,我也打赌你的方法,是尽量避免整个业务,让组件告诉布局管理器他们喜欢的大小,然后让布局管理器决定应用程序的最佳大小。绝对正确。当使用嵌套的LayoutManager时尤其如此。那是行不通的。试着运行这个并检查发生了什么:
    JFrame=newjframe();JLabel标签=新的JLabel(“某些标签”);frame.getContentPane().add(标签);frame.getContentPane().setSize(400400);frame.pack();frame.setVisible(true)我所说的不在内容窗格上,而是将另一个面板直接添加到我们设置大小的框架上。在框架上添加面板与添加到内容窗格完全相同。即使您添加了一个中间面板,它仍然无法工作。请参见此。www.java.net/node/650887这不是您在此详述的内容。在那个论坛上,这个家伙直接设置JFrame的大小。你说“设置面板的大小”。这些是不同的事情。无论如何,调用pack()会将内容窗格设置为getPreferredSize()返回的大小。在您的情况下,您没有设置任何,因此这将取决于LayoutManager,它将根据面板中的内容返回值。看看其他答案,试着解释一下:你会发现它不起作用。先前被否决了。@trashgood出于好奇,为什么重写比设置好