模块 java.desktop

类 GroupLayout

java.lang.Object
javax.swing.GroupLayout
所有已实现的接口:
LayoutManager , LayoutManager2

public class GroupLayout extends Object implements LayoutManager2
GroupLayout 是一个 LayoutManager,它对组件进行分层分组,以便将它们放置在 Container 中。 GroupLayout 旨在供构建者使用,但也可以手动编码。分组由 Group 类的实例完成。 GroupLayout 支持两种类型的组。顺序组按顺序放置其子元素,一个接一个。平行组以四种方式之一对齐其子元素。

每个组可以包含任意数量的元素,其中一个元素是 GroupComponent 或间隙。可以将间隙视为具有最小、首选和最大尺寸的不可见组件。此外 GroupLayout 支持首选间隙,其值来自 LayoutStyle

元素类似于弹簧。每个元素都有一个由最小值、首选值和最大值指定的范围。间隙具有开发人员指定的范围,或由 LayoutStyle 确定的范围。 Component 的范围由 ComponentgetMinimumSize getPreferredSizegetMaximumSize 方法确定。此外,在添加 Component 时,您可以指定要使用的特定范围,而不是组件中的范围。 Group 的范围由组的类型决定。 ParallelGroup 的范围是其元素范围的最大值。 SequentialGroup 的范围是其元素范围的总和。

GroupLayout 独立对待每个轴。即,有一组代表横轴,一组代表纵轴。水平组负责确定沿水平轴的最小、首选和最大尺寸,并设置其中包含的组件的 x 和宽度。垂直组负责确定沿垂直轴的最小、首选和最大尺寸,并设置其中包含的组件的 y 和高度。每个 Component 必须同时存在于水平和垂直组中,否则在布局期间或在请求最小、首选或最大大小时抛出 IllegalStateException

下图显示了沿水平轴的顺序组。顺序组包含三个组件。沿垂直轴使用平行组。

Sequential group along the horizontal axis in three components

为了强调每个轴都是独立处理的,该图显示了每个组和元素沿每个轴的范围。每个组件的范围已投影到轴上,并且组以蓝色(水平)和红色(垂直)呈现。为了可读性,顺序组中的每个元素之间都有一个间隙。

沿水平轴的顺序组呈现为蓝色实线。请注意,顺序组是它包含的子元素的总和。

沿垂直轴,平行组是每个组件高度的最大值。由于所有三个组件具有相同的高度,平行组具有相同的高度。

下图显示了相同的三个组件,但水平轴为平行组,垂直轴为顺序组。

Sequential group along the vertical axis in three components

由于 c1 是三个组件中最大的,因此并行组的大小为 c1。由于 c2c3 小于 c1 它们根据为组件指定的对齐方式(如果指定)或并行组的默认对齐方式对齐。在图表中,c2c3 是使用 LEADING 对齐创建的。如果组件方向是从右到左,则 c2c3 将位于相反的一侧。

下图显示了沿水平轴和垂直轴的顺序组。

Sequential group along both the horizontal and vertical axis in three components

GroupLayout 提供了在 Component 之间插入间隙的能力。间隙的大小由 LayoutStyle 的实例确定。这可以使用 setAutoCreateGaps 方法打开。同样,您可以使用 setAutoCreateContainerGaps 方法在接触父容器和容器边缘的组件之间插入间隙。

下面构建了一个面板,其中一列有两个标签,下一列有两个文本框:

  JComponent panel = ...;
  GroupLayout layout = new GroupLayout(panel);
  panel.setLayout(layout);

  // Turn on automatically adding gaps between components
  layout.setAutoCreateGaps(true);

  // Turn on automatically creating gaps between components that touch
  // the edge of the container and the container.
  layout.setAutoCreateContainerGaps(true);

  // Create a sequential group for the horizontal axis.

  GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();

  // The sequential group in turn contains two parallel groups.
  // One parallel group contains the labels, the other the text fields.
  // Putting the labels in a parallel group along the horizontal axis
  // positions them at the same x location.
  //
  // Variable indentation is used to reinforce the level of grouping.
  hGroup.addGroup(layout.createParallelGroup().
      addComponent(label1).addComponent(label2));
  hGroup.addGroup(layout.createParallelGroup().
      addComponent(tf1).addComponent(tf2));
  layout.setHorizontalGroup(hGroup);

  // Create a sequential group for the vertical axis.
  GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

  // The sequential group contains two parallel groups that align
  // the contents along the baseline. The first parallel group contains
  // the first label and text field, and the second parallel group contains
  // the second label and text field. By using a sequential group
  // the labels and text fields are positioned vertically after one another.
  vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
      addComponent(label1).addComponent(tf1));
  vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
      addComponent(label2).addComponent(tf2));
  layout.setVerticalGroup(vGroup);
 

运行时会产生以下内容。

Produced horizontal/vertical form

该布局包括以下内容。

  • 水平轴由包含两个平行组的顺序组组成。第一个并行组包含标签,第二个并行组包含文本字段。
  • 垂直轴由包含两个平行组的顺序组组成。平行组被配置为沿基线对齐它们的组件。第一个并行组包含第一个标签和第一个文本字段,第二个并行组包含第二个标签和第二个文本字段。
这段代码中有两点需要注意:
  • 您不需要显式地将组件添加到容器中;这是通过使用 Groupadd 方法之一间接完成的。
  • 各种 add 方法返回调用者。这允许轻松链接调用。例如,group.addComponent(label1).addComponent(label2); 等同于 group.addComponent(label1); group.addComponent(label2);
  • Group 没有公共构造函数;而是使用 GroupLayout 的创建方法。
自从:
1.6
  • 字段详细信息

  • 构造方法详细信息

    • GroupLayout

      public GroupLayout(Container  host)
      为指定的 Container 创建一个 GroupLayout
      参数:
      host - Container GroupLayoutLayoutManager
      抛出:
      IllegalArgumentException - 如果主机是 null
  • 方法详情

    • setHonorsVisibility

      public void setHonorsVisibility(boolean honorsVisibility)
      设置在调整组件大小和定位组件时是否考虑组件可见性。 true 值表示不可见组件不应被视为布局的一部分。 false 的值表示无论可见性如何,都应定位组件并调整其大小。

      当动态调整组件的可见性并且您不希望周围的组件和大小发生变化时,false 的值很有用。

      指定值用于未指定明确可见性的组件。

      默认值为 true

      参数:
      honorsVisibility - 在调整组件大小和定位组件时是否考虑组件可见性
      参见:
    • getHonorsVisibility

      public boolean getHonorsVisibility()
      返回在调整组件大小和定位组件时是否考虑组件可见性。
      返回:
      调整和定位组件时是否考虑组件可见性
    • setHonorsVisibility

      public void setHonorsVisibility(Component  component, Boolean  honorsVisibility)
      设置是否考虑组件的可见性来调整大小和定位。 Boolean.TRUE 值表示如果 component 不可见,则不应将其视为布局的一部分。 false 的值表示 component 的定位和大小与其可见性无关。 null 的值表示应使用单参数方法 setHonorsVisibility 指定的值。

      如果 component 不是这个 GroupLayout 管理的 Container 的孩子,它将被添加到 Container

      参数:
      component - 组件
      honorsVisibility - 是否应考虑此 component 的可见性以调整大小和定位
      抛出:
      IllegalArgumentException - 如果 componentnull
      参见:
    • setAutoCreateGaps

      public void setAutoCreateGaps(boolean autoCreatePadding)
      设置是否应自动创建组件之间的间隙。例如,如果这是 true,并且您将两个组件添加到 SequentialGroup,则会自动创建两个组件之间的间隙。默认值为 false
      参数:
      autoCreatePadding - 组件之间的间隙是否自动创建
    • getAutoCreateGaps

      public boolean getAutoCreateGaps()
      如果自动创建组件之间的间隙,则返回 true
      返回:
      true 如果自动创建组件之间的间隙
    • setAutoCreateContainerGaps

      public void setAutoCreateContainerGaps(boolean autoCreateContainerPadding)
      设置是否应自动创建容器和接触容器边界的组件之间的间隙。默认值为 false
      参数:
      autoCreateContainerPadding - 容器与接触容器边界的组件之间是否应自动创建间隙
    • getAutoCreateContainerGaps

      public boolean getAutoCreateContainerGaps()
      如果自动创建容器和容器边界组件之间的间隙,则返回 true
      返回:
      true 如果自动创建容器和容器边界组件之间的间隙
    • setHorizontalGroup

      public void setHorizontalGroup(GroupLayout.Group  group)
      设置沿水平轴定位和调整组件大小的 Group
      参数:
      group - Group 沿水平轴定位和调整组件大小
      抛出:
      IllegalArgumentException - 如果组是 null
    • setVerticalGroup

      public void setVerticalGroup(GroupLayout.Group  group)
      设置沿垂直轴定位和调整组件大小的Group
      参数:
      group - Group 沿垂直轴定位和调整组件大小
      抛出:
      IllegalArgumentException - 如果组是 null
    • createSequentialGroup

      public GroupLayout.SequentialGroup  createSequentialGroup()
      创建并返回一个 SequentialGroup
      返回:
      一个新的SequentialGroup
    • createParallelGroup

      public GroupLayout.ParallelGroup  createParallelGroup()
      创建并返回对齐方式为 Alignment.LEADINGParallelGroup。这是更通用的 createParallelGroup(Alignment) 方法的覆盖方法。
      返回:
      一个新的ParallelGroup
      参见:
    • createParallelGroup

      public GroupLayout.ParallelGroup  createParallelGroup(GroupLayout.Alignment  alignment)
      创建并返回具有指定对齐方式的 ParallelGroup。这是更通用的 createParallelGroup(Alignment,boolean) 方法的覆盖方法,其中 true 为第二个参数提供。
      参数:
      alignment - 组元素的对齐方式
      返回:
      一个新的ParallelGroup
      抛出:
      IllegalArgumentException - 如果 alignmentnull
      参见:
    • createParallelGroup

      public GroupLayout.ParallelGroup  createParallelGroup(GroupLayout.Alignment  alignment, boolean resizable)
      创建并返回具有指定对齐和调整大小行为的 ParallelGroup alignment 参数指定如何定位未填充组的子元素。例如,如果一个对齐方式为 TRAILING ParallelGroup 被赋予 100,而一个孩子只需要 50,则该孩子位于位置 50(组件方向为从左到右)。

      基线对齐仅在沿垂直轴使用时才有用。使用沿水平轴的基线对齐创建的 ParallelGroup 被视为 LEADING

      有关基线组行为的详细信息,请参阅 ParallelGroup

      参数:
      alignment - 组元素的对齐方式
      resizable - true 如果组可调整大小;如果该组不可调整大小,则首选大小用于该组的最小和最大大小
      返回:
      一个新的ParallelGroup
      抛出:
      IllegalArgumentException - 如果 alignmentnull
      参见:
    • createBaselineGroup

      public GroupLayout.ParallelGroup  createBaselineGroup(boolean resizable, boolean anchorBaselineToTop)
      创建并返回一个 ParallelGroup 使其元素沿基线对齐。
      参数:
      resizable - 组是否可调整大小
      anchorBaselineToTop - 基线是锚定到组的顶部还是底部
      返回:
      ParallelGroup
      参见:
    • linkSize

      public void linkSize(Component ... components)
      强制指定的组件具有相同的大小,而不管它们的首选大小、最小大小或最大大小。链接的组件被赋予每个链接组件的最大首选大小。例如,如果您链接两个首选宽度为 10 和 20 的组件,则两个组件的宽度都为 20。

      这可以多次使用以强制任意数量的组件共享相同的大小。

      链接组件不可调整大小。

      参数:
      components - 具有相同大小的 Component s
      抛出:
      IllegalArgumentException - 如果 componentsnull,或包含 null
      参见:
    • linkSize

      public void linkSize(int axis, Component ... components)
      强制指定组件沿指定轴具有相同的大小,而不管它们的首选大小、最小大小或最大大小如何。链接的组件被赋予每个链接组件的最大首选大小。例如,如果您沿水平轴链接两个组件并且首选宽度为 10 和 20,则两个组件的宽度都为 20。

      这可以多次使用以强制任意数量的组件共享相同的大小。

      链接的 Component 不能调整大小。

      参数:
      axis - 链接尺寸的轴; SwingConstants.HORIZONTALSwingConstants.VERTICAL 之一
      components - 具有相同大小的 Component s
      抛出:
      IllegalArgumentException - 如果 componentsnull ,或包含 null ;或 axis 不是 SwingConstants.HORIZONTALSwingConstants.VERTICAL
    • replace

      public void replace(Component  existingComponent, Component  newComponent)
      用新组件替换现有组件。
      参数:
      existingComponent - 应删除并替换为 newComponent 的组件
      newComponent - 放置在 existingComponent 位置的组件
      抛出:
      IllegalArgumentException - 如果任一组件是 nullexistingComponent 未由该布局管理器管理
    • setLayoutStyle

      public void setLayoutStyle(LayoutStyle  layoutStyle)
      设置用于计算组件之间首选间隙的 LayoutStylenull 的值表示应使用 LayoutStyle 的共享实例。
      参数:
      layoutStyle - 要使用的 LayoutStyle
      参见:
    • getLayoutStyle

      public LayoutStyle  getLayoutStyle()
      返回用于计算组件之间首选间隙的 LayoutStyle。这将返回指定给 setLayoutStyle 的值,它可能是 null
      返回:
      LayoutStyle 用于计算组件之间的首选间隙
    • addLayoutComponent

      public void addLayoutComponent(String  name, Component  component)
      Component 已添加到父容器的通知。您不应直接调用此方法,而应使用 Group 方法之一添加 Component
      指定者:
      addLayoutComponent 在接口 LayoutManager
      参数:
      name - 要与组件关联的字符串
      component - 要添加的 Component
    • removeLayoutComponent

      public void removeLayoutComponent(Component  component)
      Component 已从父容器中删除的通知。您不应直接调用此方法,而应在父级 Container 上调用 remove
      指定者:
      removeLayoutComponent 在接口 LayoutManager
      参数:
      component - 要删除的组件
      参见:
    • preferredLayoutSize

      public Dimension  preferredLayoutSize(Container  parent)
      返回指定容器的首选大小。
      指定者:
      preferredLayoutSize 在接口 LayoutManager
      参数:
      parent - 返回首选大小的容器
      返回:
      parent 的首选尺寸
      抛出:
      IllegalArgumentException - 如果 parent 不相同 Container 这是用创建的
      IllegalStateException - 如果添加到此布局的任何组件不在水平和垂直组中
      参见:
    • minimumLayoutSize

      public Dimension  minimumLayoutSize(Container  parent)
      返回指定容器的最小尺寸。
      指定者:
      minimumLayoutSize 在接口 LayoutManager
      参数:
      parent - 返回大小的容器
      返回:
      parent 的最小尺寸
      抛出:
      IllegalArgumentException - 如果 parent 与创建它的 Container 不同
      IllegalStateException - 如果添加到此布局的任何组件不在水平和垂直组中
      参见:
    • layoutContainer

      public void layoutContainer(Container  parent)
      布置指定的容器。
      指定者:
      layoutContainer 在接口 LayoutManager
      参数:
      parent - 要布置的容器
      抛出:
      IllegalStateException - 如果添加到此布局的任何组件不在水平和垂直组中
    • addLayoutComponent

      public void addLayoutComponent(Component  component, Object  constraints)
      Component 已添加到父容器的通知。您不应直接调用此方法,而应使用 Group 方法之一添加 Component
      指定者:
      addLayoutComponent 在接口 LayoutManager2
      参数:
      component - 添加的组件
      constraints - 组件放置位置的描述
    • maximumLayoutSize

      public Dimension  maximumLayoutSize(Container  parent)
      返回指定容器的最大尺寸。
      指定者:
      maximumLayoutSize 在接口 LayoutManager2
      参数:
      parent - 返回大小的容器
      返回:
      parent 的最大尺寸
      抛出:
      IllegalArgumentException - 如果 parent 与创建它的 Container 不同
      IllegalStateException - 如果添加到此布局的任何组件不在水平和垂直组中
      参见:
    • getLayoutAlignmentX

      public float getLayoutAlignmentX(Container  parent)
      返回沿 x 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。
      指定者:
      getLayoutAlignmentX 在接口 LayoutManager2
      参数:
      parent - 托管此 LayoutManagerContainer
      返回:
      对齐;此实现返回 .5
      抛出:
      IllegalArgumentException - 如果 parent 与创建它的 Container 不同
    • getLayoutAlignmentY

      public float getLayoutAlignmentY(Container  parent)
      返回沿 y 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。
      指定者:
      getLayoutAlignmentY 在接口 LayoutManager2
      参数:
      parent - 托管此 LayoutManagerContainer
      返回:
      结盟;此实现返回 .5
      抛出:
      IllegalArgumentException - 如果 parent 与创建它的 Container 不同
    • invalidateLayout

      public void invalidateLayout(Container  parent)
      使布局无效,表示如果布局管理器缓存了信息,则应将其丢弃。
      指定者:
      invalidateLayout 在接口 LayoutManager2
      参数:
      parent - 托管此 LayoutManager 的 Container
      抛出:
      IllegalArgumentException - 如果 parent 与创建它的 Container 不同
    • toString

      public String  toString()
      返回此 GroupLayout 的字符串表示形式。此方法旨在用于调试目的,返回字符串的内容和格式可能因实现而异。
      重写:
      toString 在类 Object
      返回:
      这个 GroupLayout 的字符串表示