创建自定义布局 管理 器

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

Note:

本课涵盖了手工编写布局代码,这可能会很困难。如果您不希望了解布局 管理 的所有详细信息,则可能更喜欢将GroupLayout布局 管理 器与构建器工具结合使用来布局 GUI。 NetBeans IDE是此类构建器工具之一。否则,如果您想手工编码并且不想使用GroupLayout,那么推荐使用GridBagLayout作为下一个最灵活,功能最强大的布局 管理 器。

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

若要创建自定义布局 管理 器,必须创建一个实现LayoutManagerinterface的类。您可以直接实现它,也可以实现其子interfaceLayoutManager2

每个布局 管理 器必须至少实现LayoutManagerinterface所需的以下五个方法:

  • void addLayoutComponent(String, Component)

    • Container类的add方法调用。不将字符串 与其组件关联的布局 管理 器在此方法中通常不执行任何操作。
  • void removeLayoutComponent(Component)

    • Container方法removeremoveAll调用。布局 管理 器重写此方法以清除可能与Component关联的内部状态。
  • Dimension preferredLayoutSize(Container)

    • Container类的getPreferredSize方法调用,该方法本身在各种情况下都被调用。该方法应计算并返回容器的理想尺寸,前提是该容器包含的组件将等于或大于其首选尺寸。此方法必须考虑由getInsets方法返回的容器的内部边界。
  • Dimension minimumLayoutSize(Container)

    • Container getMinimumSize方法调用,该方法本身在各种情况下都被调用。假定容器中包含的组件等于或大于其最小大小,则此方法应计算并返回容器的最小大小。此方法必须考虑到getInsets方法返回的容器的内部边界。
  • void layoutContainer(Container)

    • 调用以定位和确定容器中每个组件的大小。布局 管理 器的layoutContainer方法实际上并未绘制组件。它仅调用每个组件的setSizesetLocationsetBounds方法中的一个或多个来设置组件的大小和位置。

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

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

如果您希望支持组件约束,最大尺寸或对齐方式,则布局 管理 器应实现LayoutManager2interface。实际上,由于这些原因,几乎所有现代布局 管理 器都需要实现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 图片。

CustomLayoutDemo 的快照

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行CustomLayoutDemo。另外,要自己编译和运行示例,请查阅example index