- 所有已实现的接口:
-
LayoutManager,LayoutManager2
GroupLayout是一种LayoutManager,用于按层次分组组件以将它们定位在Container中。GroupLayout旨在供构建者使用,但也可以手动编码。分组是通过Group类的实例完成的。GroupLayout支持两种类型的组。顺序组按顺序定位其子元素,一个接一个地。并行组以四种方式之一对齐其子元素。
每个组可以包含任意数量的元素,其中元素可以是Group、Component或间隙。间隙可以被视为具有最小、首选和最大大小的不可见组件。此外,GroupLayout支持首选间隙,其值来自LayoutStyle。
元素类似于弹簧。每个元素都有一个由最小、首选和最大指定的范围。间隙具有开发人员指定的范围,或者由LayoutStyle确定的范围。对于Component的范围是从Component的getMinimumSize、getPreferredSize和getMaximumSize方法确定的。此外,在添加Component时,您可以指定要使用的特定范围,而不是来自组件的范围。 Group的范围由组的类型确定。 ParallelGroup的范围是其元素范围的最大值。 SequentialGroup的范围是其元素范围的总和。
GroupLayout独立处理每个轴。也就是说,有一个代表水平轴的组,以及一个代表垂直轴的组。水平组负责确定沿水平轴的最小、首选和最大大小,以及设置其中包含的组件的x和宽度。垂直组负责确定沿垂直轴的最小、首选和最大大小,以及设置其中包含的组件的y和高度。每个Component必须同时存在于水平和垂直组中,否则在布局期间或请求最小、首选或最大大小时会抛出IllegalStateException。
以下图示显示了沿水平轴的顺序组。顺序组包含三个组件。沿垂直轴使用了并行组。

为了强调每个轴都是独立处理的,图示显示了每个组和元素沿每个轴的范围。每个组件的范围已投影到轴上,并且组以蓝色(水平)和红色(垂直)呈现。为了便于阅读,在顺序组的每个元素之间有一个间隙。
沿水平轴的顺序组呈实线蓝色。请注意,顺序组是其包含的子元素的总和。
沿垂直轴,平行组是每个组件的高度的最大值。由于所有三个组件的高度相同,因此平行组的高度也相同。
以下图示显示了相同的三个组件,但水平轴上是并行组,垂直轴上是顺序组。

由于c1是三个组件中最大的,因此并行组的大小为c1。由于c2和c3小于c1,它们根据组件指定的对齐方式(如果指定)或并行组的默认对齐方式对齐。在图示中,c2和c3使用LEADING对齐创建。如果组件方向是从右到左,则c2和c3将定位在相反的一侧。
以下图示显示了沿水平和垂直轴的顺序组。

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);
运行后会产生以下结果。

此布局包括以下内容。
- 水平轴包括一个包含两个并行组的顺序组。第一个并行组包含标签,第二个并行组包含文本字段。
- 垂直轴包括一个包含两个并行组的顺序组。并行组配置为沿基线对齐其组件。第一个并行组包含第一个标签和第一个文本字段,第二个组包含第二个标签和第二个文本字段。
- 您无需显式将组件添加到容器中;这是通过使用
Group的add方法之一间接完成的。 - 各种
add方法返回调用者。这样可以轻松地链接调用。例如,group.addComponent(label1).addComponent(label2);等同于group.addComponent(label1); group.addComponent(label2);。 Group没有公共构造函数;而是使用GroupLayout的创建方法。
- 自JDK版本:
- 1.6
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumParallelGroup可以对其子元素进行对齐的可能方式的枚举。classclass对其子元素进行对齐和调整大小的Group。final class依次对其元素进行定位和调整大小的Group。 -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int表示应使用组件或间隙的大小作为特定范围值。static final int表示应使用组件或间隙的首选大小作为特定范围值。 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidaddLayoutComponent(Component component, Object constraints) 通知已将Component添加到父容器。voidaddLayoutComponent(String name, Component component) 通知已将Component添加到父容器。createBaselineGroup(boolean resizable, boolean anchorBaselineToTop) 创建并返回一个沿基线对齐其元素的ParallelGroup。创建并返回一个具有Alignment.LEADING对齐的ParallelGroup。createParallelGroup(GroupLayout.Alignment alignment) 创建并返回一个具有指定对齐方式的ParallelGroup。createParallelGroup(GroupLayout.Alignment alignment, boolean resizable) 创建并返回一个具有指定对齐方式和调整大小行为的ParallelGroup。创建并返回一个SequentialGroup。boolean如果自动创建容器和边框容器之间的间隙,则返回true。boolean如果自动创建组件之间的间隙,则返回true。boolean返回在调整大小和定位组件时是否考虑组件的可见性。floatgetLayoutAlignmentX(Container parent) 返回沿x轴的对齐方式。floatgetLayoutAlignmentY(Container parent) 返回沿y轴的对齐方式。返回用于计算组件之间首选间隙的LayoutStyle。voidinvalidateLayout(Container parent) 使布局无效,表示如果布局管理器缓存了信息,则应丢弃该信息。voidlayoutContainer(Container parent) 对指定的容器进行布局。void强制指定的组件沿指定轴具有相同的大小,而不考虑其首选、最小或最大大小。void强制指定的组件具有相同的大小,而不考虑其首选、最小或最大大小。maximumLayoutSize(Container parent) 返回指定容器的最大大小。minimumLayoutSize(Container parent) 返回指定容器的最小大小。preferredLayoutSize(Container parent) 返回指定容器的首选大小。voidremoveLayoutComponent(Component component) 通知一个Component已从父容器中移除。void用新组件替换现有组件。voidsetAutoCreateContainerGaps(boolean autoCreateContainerPadding) 设置是否应自动创建容器和边框接触的组件之间的间隙。voidsetAutoCreateGaps(boolean autoCreatePadding) 设置是否应自动创建组件之间的间隙。voidsetHonorsVisibility(boolean honorsVisibility) 设置在调整大小和定位组件时是否考虑组件的可见性。voidsetHonorsVisibility(Component component, Boolean honorsVisibility) 设置是否应考虑组件的可见性以进行大小和定位。void设置沿水平轴定位和调整组件大小的Group。voidsetLayoutStyle(LayoutStyle layoutStyle) 设置用于计算组件之间首选间隙的LayoutStyle。void设置沿垂直轴定位和调整组件大小的Group。toString()返回此GroupLayout的字符串表示形式。
-
Field Details
-
DEFAULT_SIZE
public static final int DEFAULT_SIZE指示应使用组件或间隙的大小作为特定范围值的大小。- 参见:
-
PREFERRED_SIZE
public static final int PREFERRED_SIZE指示应使用组件或间隙的首选大小作为特定范围值的大小。- 参见:
-
-
Constructor Details
-
GroupLayout
为指定的Container创建一个GroupLayout。- 参数:
-
host-GroupLayout为其是LayoutManager的Container - 抛出:
-
IllegalArgumentException- 如果host为null
-
-
Method Details
-
setHonorsVisibility
public void setHonorsVisibility(boolean honorsVisibility) 设置在调整大小和定位组件时是否考虑组件的可见性。值为true表示不可见组件不应视为布局的一部分。值为false表示无论可见性如何,组件都应定位和调整大小。当组件的可见性动态调整且不希望周围组件和大小发生变化时,值为
false是有用的。指定的值用于未明确指定可见性的组件。
默认值为
true。- 参数:
-
honorsVisibility- 在调整大小和定位组件时是否考虑组件的可见性 - 参见:
-
getHonorsVisibility
public boolean getHonorsVisibility()返回在调整大小和定位组件时是否考虑组件的可见性。- 返回:
- 在调整大小和定位组件时是否考虑组件的可见性
-
setHonorsVisibility
设置是否应考虑组件的可见性以进行大小和定位。值为Boolean.TRUE表示如果component不可见,则不应将其视为布局的一部分。值为false表示无论可见性如何,都应定位和调整component的大小。值为null表示应使用单参数方法setHonorsVisibility指定的值。如果
component不是此GroupLayout管理的Container的子级,则将其添加到Container中。- 参数:
-
component- 组件 -
honorsVisibility- 是否应考虑此component的可见性以进行大小和定位 - 抛出:
-
IllegalArgumentException- 如果component为null - 参见:
-
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
设置沿水平轴定位和调整组件大小的Group。- 参数:
-
group- 沿水平轴定位和调整组件大小的Group - 抛出:
-
IllegalArgumentException- 如果group为null
-
setVerticalGroup
设置沿垂直轴定位和调整组件大小的Group。- 参数:
-
group- 沿垂直轴定位和调整组件大小的Group - 抛出:
-
IllegalArgumentException- 如果group为null
-
createSequentialGroup
创建并返回一个SequentialGroup。- 返回:
-
一个新的
SequentialGroup
-
createParallelGroup
创建并返回一个对齐方式为Alignment.LEADING的ParallelGroup。这是更一般的createParallelGroup(Alignment)方法的封装方法。- 返回:
-
一个新的
ParallelGroup - 参见:
-
createParallelGroup
创建并返回一个具有指定对齐方式的ParallelGroup。这是具有true作为第二参数提供的更一般的createParallelGroup(Alignment,boolean)方法的封装方法。- 参数:
-
alignment- 组的元素的对齐方式 - 返回:
-
一个新的
ParallelGroup - 抛出:
-
IllegalArgumentException- 如果alignment为null - 参见:
-
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- 如果alignment为null - 参见:
-
createBaselineGroup
public GroupLayout.ParallelGroup createBaselineGroup(boolean resizable, boolean anchorBaselineToTop) 创建并返回一个沿基线对齐其元素的ParallelGroup。- 参数:
-
resizable- 组是否可调整大小 -
anchorBaselineToTop- 基线是锚定到组的顶部还是底部 - 返回:
-
ParallelGroup - 参见:
-
linkSize
强制指定的组件具有相同的大小,而不考虑它们的首选、最小或最大大小。链接的组件将获得链接组件的首选大小的最大值。例如,如果链接两个首选宽度分别为10和20的组件,则两个组件的宽度都将为20。可以多次使用此方法来强制任意数量的组件共享相同的大小。
链接的组件不可调整大小。
- 参数:
-
components- 应具有相同大小的Component - 抛出:
-
IllegalArgumentException- 如果components为null,或包含null - 参见:
-
linkSize
强制指定的组件沿指定轴具有相同的大小,而不考虑它们的首选、最小或最大大小。链接的组件将获得链接组件的首选大小的最大值。例如,如果沿水平轴链接两个组件,首选宽度分别为10和20,则两个组件的宽度都将为20。可以多次使用此方法来强制任意数量的组件共享相同的大小。
链接的
Component不可调整大小。- 参数:
-
axis- 要沿其链接大小的轴;SwingConstants.HORIZONTAL或SwingConstants.VERTICAL之一 -
components- 应具有相同大小的Component - 抛出:
-
IllegalArgumentException- 如果components为null,或包含null;或axis不是SwingConstants.HORIZONTAL或SwingConstants.VERTICAL
-
replace
用新组件替换现有组件。- 参数:
-
existingComponent- 应删除并替换为newComponent的组件 -
newComponent- 放置在existingComponent位置的组件 - 抛出:
-
IllegalArgumentException- 如果任一组件为null或existingComponent未由此布局管理器管理
-
setLayoutStyle
设置用于计算组件之间首选间隙的LayoutStyle。值为null表示应使用LayoutStyle的共享实例。- 参数:
-
layoutStyle- 要使用的LayoutStyle - 参见:
-
getLayoutStyle
返回用于计算组件之间首选间隙的LayoutStyle。这将返回指定给setLayoutStyle的值,可能为null。- 返回:
-
用于计算组件之间首选间隙的
LayoutStyle
-
addLayoutComponent
通知已将Component添加到父容器。您不应直接调用此方法,而应使用Group方法之一来添加Component。- 指定者:
-
addLayoutComponent在接口LayoutManager - 参数:
-
name- 与组件关联的字符串 -
component- 要添加的Component
-
removeLayoutComponent
通知已将Component从父容器中移除。您不应直接调用此方法,而应在父Container上调用remove。- 指定者:
-
removeLayoutComponent在接口LayoutManager - 参数:
-
component- 要移除的组件 - 参见:
-
preferredLayoutSize
返回指定容器的首选大小。- 指定者:
-
preferredLayoutSize在接口LayoutManager - 参数:
-
parent- 要返回首选大小的容器 - 返回:
-
parent的首选大小 - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同 -
IllegalStateException- 如果添加到此布局的任何组件既不在水平组中也不在垂直组中 - 参见:
-
minimumLayoutSize
返回指定容器的最小大小。- 指定者:
-
minimumLayoutSize在接口LayoutManager - 参数:
-
parent- 要返回大小的容器 - 返回:
-
parent的最小大小 - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同 -
IllegalStateException- 如果添加到此布局的任何组件既不在水平组中也不在垂直组中 - 参见:
-
layoutContainer
对指定容器进行布局。- 指定者:
-
layoutContainer在接口LayoutManager - 参数:
-
parent- 要布局的容器 - 抛出:
-
IllegalStateException- 如果添加到此布局的任何组件既不在水平组中也不在垂直组中
-
addLayoutComponent
通知已将Component添加到父容器。您不应直接调用此方法,而应使用Group方法之一来添加Component。- 指定者:
-
addLayoutComponent在接口LayoutManager2 - 参数:
-
component- 要添加的组件 -
constraints- 放置组件的描述
-
maximumLayoutSize
返回指定容器的最大大小。- 指定者:
-
maximumLayoutSize在接口LayoutManager2 - 参数:
-
parent- 要返回大小的容器 - 返回:
-
parent的最大大小 - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同 -
IllegalStateException- 如果添加到此布局的任何组件既不在水平组中也不在垂直组中 - 参见:
-
getLayoutAlignmentX
返回沿x轴的对齐方式。这指定组件希望相对于其他组件对齐的方式。该值应为介于0和1之间的数字,其中0表示沿原点对齐,1表示与原点最远的对齐,0.5表示居中对齐,等等。- 指定由:
-
getLayoutAlignmentX在接口LayoutManager2 - 参数:
-
parent- 托管此LayoutManager的Container - 返回:
-
对齐方式; 此实现返回
.5 - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同
-
getLayoutAlignmentY
返回沿y轴的对齐方式。这指定了组件希望相对于其他组件对齐的方式。该值应为介于0和1之间的数字,其中0表示沿原点对齐,1表示与原点最远对齐,0.5表示居中,依此类推。- 指定由:
-
getLayoutAlignmentY在接口LayoutManager2 - 参数:
-
parent- 托管此LayoutManager的Container - 返回:
-
对齐方式; 此实现返回
.5 - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同
-
invalidateLayout
使布局失效,表示如果布局管理器缓存了信息,则应丢弃该信息。- 指定由:
-
invalidateLayout在接口LayoutManager2 - 参数:
-
parent- 托管此LayoutManager的Container - 抛出:
-
IllegalArgumentException- 如果parent与创建此对象的Container不同
-
toString
返回此GroupLayout的字符串表示形式。此方法旨在用于调试目的,返回的字符串的内容和格式可能因实现而异。
-