这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化以了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
在创建自定义布局管理器之前,请确保没有现有的布局管理器符合您的要求。特别是像GridBagLayout、SpringLayout和BoxLayout这样的布局管理器,在许多情况下都足够灵活。您还可以从其他来源(如互联网)找到布局管理器。最后,您可以通过将组件分组到容器中(如panels)来简化布局。
GroupLayout布局管理器结合构建工具来布局您的GUI。其中一种构建工具是NetBeans IDE。否则,如果您想手动编码而且不想使用GroupLayout,那么建议您使用GridBagLayout作为下一个最灵活和强大的布局管理器。
如果您有兴趣使用JavaFX来创建GUI,请参阅JavaFX中的布局。
要创建自定义布局管理器,必须创建一个实现LayoutManager接口的类。您可以直接实现它,或者实现它的子接口LayoutManager2。
每个布局管理器必须实现至少以下五个方法,这是LayoutManager接口所要求的:
void addLayoutComponent(String, Component)
Container类的add方法调用。不将字符串与其组件关联的布局管理器通常在此方法中不执行任何操作。
void removeLayoutComponent(Component)
Container类的remove和removeAll方法调用。布局管理器重写此方法以清除与Component相关联的内部状态。
Dimension preferredLayoutSize(Container)
Container类的getPreferredSize方法调用,该方法本身在各种情况下被调用。该方法应计算并返回容器的理想大小,假设其包含的组件将达到或超过其首选大小。该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。
Dimension minimumLayoutSize(Container)
Container的getMinimumSize方法调用,该方法本身在各种情况下被调用。该方法应计算并返回容器的最小大小,假设其包含的组件将达到或超过其最小大小。该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。
void layoutContainer(Container)
layoutContainer方法实际上不会绘制组件。它只是调用每个组件的setSize、setLocation和setBounds方法中的一个或多个来设置组件的大小和位置。
该方法必须考虑容器的内部边界,这些边界由getInsets方法返回。如果适用,它还应考虑容器的方向(由getComponentOrientation方法返回)。不能假设在调用layoutContainer之前将调用preferredLayoutSize或minimumLayoutSize方法。
除了实现上述五个方法之外,布局管理器通常还会实现至少一个公共构造函数和toString方法。
如果要支持组件约束、最大大小或对齐方式,则布局管理器应实现LayoutManager2接口。实际上,出于这些原因以及许多其他原因,几乎所有现代布局管理器都需要实现LayoutManager2。该接口在LayoutManager所要求的基础上增加了五个方法:
addLayoutComponent(Component, Object):添加组件到布局中,使用指定的约束对象。getLayoutAlignmentX(Container):获取布局在X轴方向上的对齐方式。getLayoutAlignmentY(Container):获取布局在Y轴方向上的对齐方式。invalidateLayout(Container):使布局无效化,如果布局管理器有缓存的信息,应该将其丢弃。maximumLayoutSize(Container):获取布局的最大尺寸。其中最重要的方法是 addLayoutComponent(Component, Object) 和 invalidateLayout(Container)。 addLayoutComponent 方法用于使用指定的约束对象将组件添加到布局中。 invalidateLayout 方法用于使布局无效化,如果布局管理器有缓存的信息,应该将其丢弃。有关 LayoutManager2 的更多信息,请参阅LayoutManager2 API 文档。
最后,当您创建自定义布局管理器时,应该注意保持对不再是容器子元素的 Component 实例的引用。也就是说,布局管理器应该重写 removeLayoutComponent 方法来清除与 Component 相关的任何缓存状态。
示例 CustomLayoutDemo 使用了名为 DiagonalLayout 的自定义布局管理器。您可以在 DiagonalLayout.java 中找到布局管理器的源代码。 DialogLayout 将组件从左到右对角线排列,每行一个组件。下面是使用 DialogLayout 布局五个按钮的 CustomLayoutDemo 的截图。
点击“启动”按钮运行 CustomLayoutDemo,使用Java™ Web Start(下载 JDK 7 或更高版本)。或者,如果您想自己编译和运行示例,请参考示例索引。