Module java.desktop
Package javax.swing

Class 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的范围是从ComponentgetMinimumSizegetPreferredSizegetMaximumSize方法确定的。此外,在添加Component时,您可以指定要使用的特定范围,而不是来自组件的范围。 Group的范围由组的类型确定。 ParallelGroup的范围是其元素范围的最大值。 SequentialGroup的范围是其元素范围的总和。

GroupLayout独立处理每个轴。也就是说,有一个代表水平轴的组,以及一个代表垂直轴的组。水平组负责确定沿水平轴的最小、首选和最大大小,以及设置其中包含的组件的x和宽度。垂直组负责确定沿垂直轴的最小、首选和最大大小,以及设置其中包含的组件的y和高度。每个Component必须同时存在于水平和垂直组中,否则在布局期间或请求最小、首选或最大大小时会抛出IllegalStateException

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

水平轴上的顺序组中的三个组件

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

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

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

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

垂直轴上的顺序组中的三个组件

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

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

水平和垂直轴上的顺序组中的三个组件

GroupLayout提供了在Component之间插入间隙的功能。间隙的大小由LayoutStyle的一个实例确定。可以使用setAutoCreateGaps方法打开此功能。类似地,您可以使用setAutoCreateContainerGaps方法在组件之间插入触及父容器边缘和容器之间的间隙。

以下构建了一个面板,其中包含一列中的两个标签,后跟下一列中的两个文本字段:

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

   // 打开在组件之间自动添加间隙
   layout.setAutoCreateGaps(true);

   // 打开在组件之间自动创建触及容器边缘和容器之间的间隙
   layout.setAutoCreateContainerGaps(true);

   // 为水平轴创建一个顺序组

   GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();

   // 顺序组又包含两个并行组。
   // 一个并行组包含标签,另一个包含文本字段。
   // 将标签放在水平轴上的并行组中
   // 将它们定位在相同的x位置。
   //
   // 使用可变缩进来强调分组级别。
   hGroup.addGroup(layout.createParallelGroup().
            addComponent(label1).addComponent(label2));
   hGroup.addGroup(layout.createParallelGroup().
            addComponent(tf1).addComponent(tf2));
   layout.setHorizontalGroup(hGroup);

   // 为垂直轴创建一个顺序组。
   GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

   // 顺序组包含两个并行组,沿基线对齐内容。
   // 第一个并行组包含第一个标签和文本字段,第二个并行组包含第二个标签和文本字段。
   // 通过使用顺序组,标签和文本字段在垂直方向上依次定位。
   vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
            addComponent(label1).addComponent(tf1));
   vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
            addComponent(label2).addComponent(tf2));
   layout.setVerticalGroup(vGroup);
 

运行后会产生以下结果。

生成的水平/垂直表单

此布局包括以下内容。

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

  • Constructor Details

    • GroupLayout

      public GroupLayout(Container host)
      为指定的Container创建一个GroupLayout
      参数:
      host - GroupLayout为其是LayoutManagerContainer
      抛出:
      IllegalArgumentException - 如果host为null
  • Method Details

    • 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 - 如果group为null
    • setVerticalGroup

      public void setVerticalGroup(GroupLayout.Group group)
      设置沿垂直轴定位和调整组件大小的Group
      参数:
      group - 沿垂直轴定位和调整组件大小的Group
      抛出:
      IllegalArgumentException - 如果group为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。这是具有true作为第二参数提供的更一般的createParallelGroup(Alignment,boolean)方法的封装方法。
      参数:
      alignment - 组的元素的对齐方式
      返回:
      一个新的ParallelGroup
      抛出:
      IllegalArgumentException - 如果alignmentnull
      参见:
    • createParallelGroup

      public GroupLayout.ParallelGroup createParallelGroup(GroupLayout.Alignment alignment, boolean resizable)
      创建并返回一个具有指定对齐方式和调整大小行为的ParallelGroupalignment参数指定未填充组的子元素的位置。例如,如果给定对齐方式为TRAILINGParallelGroup为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
      抛出:
      IllegalArgumentException - 如果componentsnull,或包含null
      参见:
    • linkSize

      public void linkSize(int axis, Component... components)
      强制指定的组件沿指定轴具有相同的大小,而不考虑它们的首选、最小或最大大小。链接的组件将获得链接组件的首选大小的最大值。例如,如果沿水平轴链接两个组件,首选宽度分别为10和20,则两个组件的宽度都将为20。

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

      链接的Component不可调整大小。

      参数:
      axis - 要沿其链接大小的轴;SwingConstants.HORIZONTALSwingConstants.VERTICAL之一
      components - 应具有相同大小的Component
      抛出:
      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)
      设置用于计算组件之间首选间隙的LayoutStyle。值为null表示应使用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 - 托管此LayoutManagerContainer
      抛出:
      IllegalArgumentException - 如果parent与创建此对象的Container不同
    • toString

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