创建自定义布局 管理 器
在开始创建自定义布局 管理 器之前,请确保没有现有的布局 管理 器符合您的要求。特别是,诸如GridBagLayout,SpringLayout和BoxLayout之类的布局 管理 器足够灵活,可以在许多情况下使用。您还可以从其他来源(例如从 Internet)中找到布局 管理 器。最后,您可以通过将组件分组到panels之类的容器中来简化布局。
Note:
本课涵盖了手工编写布局代码,这可能会很困难。如果您不希望了解布局 管理 的所有详细信息,则可能更喜欢将GroupLayout
布局 管理 器与构建器工具结合使用来布局 GUI。 NetBeans IDE是此类构建器工具之一。否则,如果您想手工编码并且不想使用GroupLayout
,那么推荐使用GridBagLayout
作为下一个最灵活,功能最强大的布局 管理 器。
如果您对使用 JavaFX 创建 GUI 感兴趣,请参阅在 JavaFX 中使用布局。
若要创建自定义布局 管理 器,必须创建一个实现LayoutManagerinterface的类。您可以直接实现它,也可以实现其子interfaceLayoutManager2。
每个布局 管理 器必须至少实现LayoutManager
interface所需的以下五个方法:
-
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
interface。实际上,由于这些原因,几乎所有现代布局 管理 器都需要实现LayoutManager2
。该interface为LayoutManager
所需的方法添加了五种方法:
-
addLayoutComponent(Component, Object)
-
getLayoutAlignmentX(Container)
-
getLayoutAlignmentY(Container)
-
invalidateLayout(Container)
-
maximumLayoutSize(Container)
在这些方法中,最重要的是addLayoutComponent(Component, Object)
和invalidateLayout(Container)
。 addLayoutComponent
方法用于使用指定的约束对象将组件添加到布局。 invalidateLayout
方法用于使布局无效,因此,如果布局 管理 器已缓存信息,则应将其丢弃。有关LayoutManager2
的更多信息,请参阅LayoutManager2 API 文档。
最后,无论何时创建自定义布局 管理 器,都应注意保留对不再是Container
子级的Component
实例的引用。即,布局 管理 器应覆盖removeLayoutComponent
,以清除与Component
相关的所有缓存状态。
自定义布局的示例
示例CustomLayoutDemo
使用了名为DiagonalLayout
的自定义布局 管理 器。您可以在DiagonalLayout.java中找到布局 管理 器的源代码。 DialogLayout
从左到右对角线排列组件,每行一个组件。这是使用DialogLayout
布置五个按钮的 CustomLayoutDemo 图片。
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行CustomLayoutDemo
。另外,要自己编译和运行示例,请查阅example index。