文档

Java™ 教程
隐藏目录
不使用布局管理器(绝对定位)
导航: 使用Swing创建GUI
课程: 在容器内布置组件

不使用布局管理器(绝对定位)

尽管可以不使用布局管理器,但如果可能的话,应该尽量使用布局管理器。布局管理器使得调整组件外观(与外观相关)、不同字体大小、容器大小变化和不同语言环境更加容易。布局管理器也可以轻松地被其他容器和程序重用。


注意: 本课程涵盖手动编写布局代码,这可能会有挑战性。如果您不想学习布局管理的所有细节,可以选择使用GroupLayout布局管理器结合构建工具来布局您的GUI。其中一种构建工具是NetBeans IDE。否则,如果您想手动编码而不想使用GroupLayout,那么GridBagLayout被推荐作为下一个最灵活和强大的布局管理器。

如果您有兴趣使用JavaFX来创建GUI,请参阅在JavaFX中使用布局

如果一个容器中的组件的大小不受容器的大小、字体、外观或语言的影响,则绝对定位可能是合理的。桌面窗格(包含内部窗体)属于此类别。内部窗体的大小和位置不直接取决于桌面窗格的大小。程序员确定内部窗体在桌面窗格中的初始大小和位置,然后用户可以移动或调整窗体的大小。在这种情况下,布局管理器是不必要的。

另一种适用于绝对定位的情况是自定义容器,它执行对容器特定的大小和位置计算,并可能需要了解容器的特殊状态。这就是分割窗格的情况。

创建一个没有布局管理器的容器涉及以下步骤。

  1. 通过调用setLayout(null)将容器的布局管理器设置为null。
  2. 对于容器的每个子组件,调用Component类的setbounds方法。
  3. 调用Component类的repaint方法。

但是,如果包含容器的窗口调整大小,使用绝对定位的容器可能会导致问题。

这是一个内容窗格使用绝对定位的框架的快照。

AbsoluteLayoutDemo的快照

点击"启动"按钮使用Java™ Web Start运行AbsoluteLayoutDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引

启动AbsoluteLayoutDemo示例

其代码位于AbsoluteLayoutDemo.java。下面的代码片段显示了如何创建和布局内容窗格中的组件。

pane.setLayout(null);

JButton b1 = new JButton("one");
JButton b2 = new JButton("two");
JButton b3 = new JButton("three");

pane.add(b1);
pane.add(b2);
pane.add(b3);

Insets insets = pane.getInsets();
Dimension size = b1.getPreferredSize();
b1.setBounds(25 + insets.left, 5 + insets.top,
             size.width, size.height);
size = b2.getPreferredSize();
b2.setBounds(55 + insets.left, 40 + insets.top,
             size.width, size.height);
size = b3.getPreferredSize();
b3.setBounds(150 + insets.left, 15 + insets.top,
             size.width + 50, size.height + 20);

...//在main方法中:
Insets insets = frame.getInsets();
frame.setSize(300 + insets.left + insets.right,
              125 + insets.top + insets.bottom);


上一页: 创建自定义布局管理器
下一页: 解决常见布局问题