文档

Java™教程
隐藏目录
创建自定义布局管理器
教程:使用Swing创建GUI
课程:在容器中布置组件

创建自定义布局管理器

在创建自定义布局管理器之前,请确保没有现有的布局管理器符合您的要求。特别是像GridBagLayoutSpringLayoutBoxLayout这样的布局管理器,在许多情况下都足够灵活。您还可以从其他来源(如互联网)找到布局管理器。最后,您可以通过将组件分组到容器中(如panels)来简化布局。


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

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

要创建自定义布局管理器,必须创建一个实现LayoutManager接口的类。您可以直接实现它,或者实现它的子接口LayoutManager2

每个布局管理器必须实现至少以下五个方法,这是LayoutManager接口所要求的:

void addLayoutComponent(String, Component)
Container类的add方法调用。不将字符串与其组件关联的布局管理器通常在此方法中不执行任何操作。
void removeLayoutComponent(Component)
Container类的removeremoveAll方法调用。布局管理器重写此方法以清除与Component相关联的内部状态。
Dimension preferredLayoutSize(Container)
Container类的getPreferredSize方法调用,该方法本身在各种情况下被调用。该方法应计算并返回容器的理想大小,假设其包含的组件将达到或超过其首选大小。该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。
Dimension minimumLayoutSize(Container)
ContainergetMinimumSize方法调用,该方法本身在各种情况下被调用。该方法应计算并返回容器的最小大小,假设其包含的组件将达到或超过其最小大小。该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。
void layoutContainer(Container)
用于定位和调整容器中的每个组件的位置和大小。布局管理器的layoutContainer方法实际上不会绘制组件。它只是调用每个组件的setSizesetLocationsetBounds方法中的一个或多个来设置组件的大小和位置。

该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。如果适用,它还应考虑容器的方向(由getComponentOrientation方法返回)。不能假设在调用layoutContainer之前将调用preferredLayoutSizeminimumLayoutSize方法。

除了实现上述五个方法之外,布局管理器通常还会实现至少一个公共构造函数和toString方法。

如果要支持组件约束、最大大小或对齐方式,则布局管理器应实现LayoutManager2接口。实际上,出于这些原因以及许多其他原因,几乎所有现代布局管理器都需要实现LayoutManager2。该接口在LayoutManager所要求的基础上增加了五个方法:

其中最重要的方法是 addLayoutComponent(Component, Object)invalidateLayout(Container)addLayoutComponent 方法用于使用指定的约束对象将组件添加到布局中。 invalidateLayout 方法用于使布局无效化,如果布局管理器有缓存的信息,应该将其丢弃。有关 LayoutManager2 的更多信息,请参阅LayoutManager2 API 文档。

最后,当您创建自定义布局管理器时,应该注意保持对不再是容器子元素的 Component 实例的引用。也就是说,布局管理器应该重写 removeLayoutComponent 方法来清除与 Component 相关的任何缓存状态。

自定义布局的示例

示例 CustomLayoutDemo 使用了名为 DiagonalLayout 的自定义布局管理器。您可以在 DiagonalLayout.java 中找到布局管理器的源代码。 DialogLayout 将组件从左到右对角线排列,每行一个组件。下面是使用 DialogLayout 布局五个按钮的 CustomLayoutDemo 的截图。

CustomLayoutDemo 的截图

点击“启动”按钮运行 CustomLayoutDemo,使用Java™ Web Start下载 JDK 7 或更高版本)。或者,如果您想自己编译和运行示例,请参考示例索引

启动 CustomLayoutDemo 示例

上一页:如何使用 SpringLayout
下一页:没有布局管理器 (绝对定位)