2

这是我用来实例化 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 上也发生了同样的事情。

我究竟做错了什么 ?

4

5 回答 5

5
  1. 如果您希望内容窗格精确为 400x400,那么我会考虑将其 preferredSize 设置为 400x400(尽管我不喜欢在内容窗格上强制使用首选尺寸,但在某些情况下它可能是可以接受的)。
  2. 在设置了首选尺寸之后,在显示框架之前,调用pack()框架。

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

于 2012-10-03T15:37:13.937 回答
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()在顶级窗口上使用并使用布局管理器。

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

于 2012-10-03T15:37:21.343 回答
2

你误解了你正在使用的东西,所以它看起来是“错误的”。

插图不是内容窗格之外“东西”的尺寸。它们类似于内容窗格周围的“边框”,不允许进行绘图。与边框不同,插图不重叠。

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

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

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

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

于 2012-10-03T15:39:51.897 回答
2
  1. 在面板中制作您的用户界面。
  2. 设置面板的首选尺寸。
  3. 将面板添加到框架并调用pack()
于 2012-10-03T15:38:43.297 回答
0
  • BorderLayout(pre_implemented in the JFrame API) 忽略Insets,

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

基本和普通的东西

  • JFrame(和大部分)只能Containers返回Insets, Bounds,Size

    a) 从已经可见的容器中

    b) 通话后JFrame(e.i.)#pack()

  • 那么在大多数情况下,设置为Insets, Bounds, Size,XxxSize而不是相反的,因为

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

  • 但不包括

    一) Graphics(2D)

    b) 对于空容器

    c) JScrollPane& ,在可以通过容器调整大小JList / JTable的情况下生成自己的代码怪物是矛盾的JScrollPane

于 2012-10-03T16:17:26.417 回答