java.lang.Object javax.swing.GroupLayout
public class GroupLayout
GroupLayout
是一个 LayoutManager
,它将组件按层次分组,以决定它们在 Container
中的位置。GroupLayout
主要供生成器使用,但也可以手工编码。分组由 Group
类的实例来完成。GroupLayout
支持两种组。串行组 (sequential group) 按顺序一个接一个地放置其子元素。并行组 (parallel group) 能够以四种方式对齐其子元素。
每个组可以包含任意数量的元素,其中元素有 Group
、Component
或间隙 (gap)。间隙可被视为一个具有最小大小、首选大小和最大大小的不可见组件。此外,GroupLayout
还支持其值取自 LayoutStyle
的首选间隙。
元素类似于一个弹簧。每个元素都有一个范围,由最小大小、首选大小和最大大小指定。间隙的范围由开发人员指定,或者由 LayoutStyle
确定。Component
的范围通过 Component
的 getMinimumSize
、getPreferredSize
和 getMaximumSize
方法确定。此外,添加 Component
时,可以指定使用一个特定范围,而不使用该组件的范围。Group
的范围由组的类型确定。ParallelGroup
的范围是其元素范围的最大值。SequentialGroup
的范围是其元素范围的总和。
GroupLayout
将每个轴 (axis) 单独对待。也就是说,存在一个表示水平轴的组和一个表示垂直轴的组。水平组负责确定沿水平轴的最小大小、首选大小和最大大小,并设置所包含组件的 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); // 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);
运行代码时,将出现下面的窗口。
此布局由以下部分组成。
Group
的一个 add
方法间接完成此操作。 add
方法返回调用者。这使得调用能很方便地进行链接。例如,group.addComponent(label1).addComponent(label2);
等效于 group.addComponent(label1); group.addComponent(label2);
。 Group
没有公共构造方法;请使用 GroupLayout
的创建方法替代。
嵌套类摘要 | |
---|---|
static class |
GroupLayout.Alignment ParallelGroup 能够对齐其子元素的可能方式的枚举。 |
class |
GroupLayout.Group Group 为 GroupLayout 所支持的以下两种操作提供基础:一个接一个地布置组件(SequentialGroup )或对齐组件(ParallelGroup )。 |
class |
GroupLayout.ParallelGroup 一个 Group ,它对齐其子元素并确定其大小。 |
class |
GroupLayout.SequentialGroup 一个 Group ,它按顺序一个接一个地确定其元素的位置和大小。 |
字段摘要 | |
---|---|
static int |
DEFAULT_SIZE 指示组件或间隙的大小应该用于特定的范围值。 |
static int |
PREFERRED_SIZE 指示组件或间隙的首选大小应该用于特定的范围值。 |
构造方法摘要 | |
---|---|
GroupLayout(Container host) 为指定的 Container 创建 GroupLayout 。 |
方法摘要 | |
---|---|
void |
addLayoutComponent(Component component, Object constraints) 已将 Component 添加到父容器的通知。 |
void |
addLayoutComponent(String name, Component component) 已将 Component 添加到父容器的通知。 |
GroupLayout.ParallelGroup |
createBaselineGroup(boolean resizable, boolean anchorBaselineToTop) 创建并返回一个沿基线对齐其元素的 ParallelGroup 。 |
GroupLayout.ParallelGroup |
createParallelGroup() 使用 Alignment.LEADING 的对齐方式创建并返回一个 ParallelGroup 。 |
GroupLayout.ParallelGroup |
createParallelGroup(GroupLayout.Alignment alignment) 使用指定的对齐方式创建并返回一个 ParallelGroup 。 |
GroupLayout.ParallelGroup |
createParallelGroup(GroupLayout.Alignment alignment, boolean resizable) 使用指定的对齐方式和调整大小行为创建并返回一个 ParallelGroup 。 |
GroupLayout.SequentialGroup |
createSequentialGroup() 创建并返回一个 SequentialGroup 。 |
boolean |
getAutoCreateContainerGaps() 如果自动创建容器与触到容器边框的组件之间的间隙,则返回 true 。 |
boolean |
getAutoCreateGaps() 如果自动创建组件之间的间隙,则返回 true 。 |
boolean |
getHonorsVisibility() 返回确定组件的大小和位置时是否要考虑组件的可见性。 |
float |
getLayoutAlignmentX(Container parent) 返回沿 x 轴的对齐方式。 |
float |
getLayoutAlignmentY(Container parent) 返回沿 y 轴的对齐方式。 |
LayoutStyle |
getLayoutStyle() 返回 LayoutStyle ,用于计算组件之间的首选间隙。 |
void |
invalidateLayout(Container parent) 使布局失效,指示如果布局管理器缓存了信息,则应该将其丢弃。 |
void |
layoutContainer(Container parent) 布置指定的容器。 |
void |
linkSize(Component... components) 将指定组件强制调整为具有相同的大小,而不管其首选大小、最小大小或最大大小如何。 |
void |
linkSize(int axis, Component... components) 将指定组件强制调整为沿指定轴具有相同的大小,而不管其首选大小、最小大小或最大大小如何。 |
Dimension |
maximumLayoutSize(Container parent) 返回指定容器的最大大小。 |
Dimension |
minimumLayoutSize(Container parent) 返回指定容器的最小大小。 |
Dimension |
preferredLayoutSize(Container parent) 返回指定容器的首选大小。 |
void |
removeLayoutComponent(Component component) 已从父容器中移除 Component 的通知。 |
void |
replace(Component existingComponent, Component newComponent) 使用新的组件替代现有组件。 |
void |
setAutoCreateContainerGaps(boolean autoCreateContainerPadding) 设置是否应该自动创建容器与触到容器边框的组件之间的间隙。 |
void |
setAutoCreateGaps(boolean autoCreatePadding) 设置是否将自动创建组件之间的间隙。 |
void |
setHonorsVisibility(boolean honorsVisibility) 设置确定组件的大小和位置时是否要考虑组件的可见性。 |
void |
setHonorsVisibility(Component component, Boolean honorsVisibility) 设置确定组件的大小和位置时是否要考虑组件的可见性。 |
void |
setHorizontalGroup(GroupLayout.Group group) 设置沿水平轴确定组件位置和大小的 Group 。 |
void |
setLayoutStyle(LayoutStyle layoutStyle) 设置用于计算组件之间首选间隙的 LayoutStyle 。 |
void |
setVerticalGroup(GroupLayout.Group group) 设置沿垂直轴确定组件位置和大小的 Group 。 |
String |
toString() 返回此 GroupLayout 的字符串表示形式。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
字段详细信息 |
---|
public static final int DEFAULT_SIZE
GroupLayout.Group
,
常量字段值
public static final int PREFERRED_SIZE
GroupLayout.Group
,
常量字段值
构造方法详细信息 |
---|
public GroupLayout(Container host)
Container
创建
GroupLayout
。
host
-
Container
,创建的
GroupLayout
将作为其
LayoutManager
IllegalArgumentException
- 如果 host 为
null
方法详细信息 |
---|
public void setHonorsVisibility(boolean honorsVisibility)
true
值指示非可见组件不应该被视为布局的一部分。
false
值指示组件应该被确定位置和大小,而不管其可见性如何。
当组件的可见性是动态调整的并且不想更改周围的组件及其大小时,false
值很有用。
指定的值用于没有指定明确可见性的组件。
默认值为 true
。
honorsVisibility
- 确定组件的大小和位置时是否要考虑组件的可见性
setHonorsVisibility(Component,Boolean)
public boolean getHonorsVisibility()
public void setHonorsVisibility(Component component, Boolean honorsVisibility)
Boolean.TRUE
值指示如果
component
不可见,则它不应该被视为布局的一部分。
false
值指示
component
应该被确定位置和大小,而不管其可见性如何。
null
值指示应该使用由单参数方法
setHonorsVisibility
指定的值。
如果 component
不是此 GroupLayout
管理的 Container
的子组件,则它将被添加到 Container
。
component
- 组件
honorsVisibility
- 确定大小和位置时是否要考虑
component
的可见性
IllegalArgumentException
- 如果
component
为
null
setHonorsVisibility(Component,Boolean)
public void setAutoCreateGaps(boolean autoCreatePadding)
true
并且向
SequentialGroup
添加了两个组件,则将自动创建这两个组件之间的间隙。默认值为
false
。
autoCreatePadding
- 是否自动创建组件之间的间隙
public boolean getAutoCreateGaps()
true
。
true
public void setAutoCreateContainerGaps(boolean autoCreateContainerPadding)
false
。
autoCreateContainerPadding
- 是否应该自动创建容器与触到容器边框的组件之间的间隙
public boolean getAutoCreateContainerGaps()
true
。
true
public void setHorizontalGroup(GroupLayout.Group group)
Group
。
group
- 沿水平轴确定组件位置和大小的
Group
IllegalArgumentException
- 如果 group 为
null
public void setVerticalGroup(GroupLayout.Group group)
Group
。
group
- 沿垂直轴确定组件位置和大小的
Group
IllegalArgumentException
- 如果 group 为
null
public GroupLayout.SequentialGroup createSequentialGroup()
SequentialGroup
。
SequentialGroup
public GroupLayout.ParallelGroup createParallelGroup()
Alignment.LEADING
的对齐方式创建并返回一个
ParallelGroup
。此方法是更常用的
createParallelGroup(Alignment)
方法的覆盖方法。
ParallelGroup
createParallelGroup(Alignment)
public GroupLayout.ParallelGroup createParallelGroup(GroupLayout.Alignment alignment)
ParallelGroup
。此方法是更常用的
createParallelGroup(Alignment,boolean)
方法(其中第二个参数为
true
)的覆盖方法。
alignment
- 组元素的对齐方式
ParallelGroup
IllegalArgumentException
- 如果
alignment
为
null
createBaselineGroup(boolean, boolean)
,
GroupLayout.ParallelGroup
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(boolean, boolean)
,
GroupLayout.ParallelGroup
public GroupLayout.ParallelGroup createBaselineGroup(boolean resizable, boolean anchorBaselineToTop)
ParallelGroup
。
resizable
- 组是否是可调整大小的
anchorBaselineToTop
- 基线是固定在组的顶部还是底部
createBaselineGroup(boolean, boolean)
,
GroupLayout.ParallelGroup
public void linkSize(Component... components)
可以多次使用此方法来将任意数量的组件强制调整为具有相同的大小。
链接的 Component 是不可调整大小的。
components
- 要具有相同大小的
Component
IllegalArgumentException
- 如果
components
为
null
或包含
null
linkSize(int,Component[])
public void linkSize(int axis, Component... components)
可以多次使用此方法来将任意数量的组件强制调整为具有相同的大小。
链接的 Component
是不可调整大小的。
components
- 要具有相同大小的
Component
axis
- 沿其链接大小的轴;
SwingConstants.HORIZONTAL
或
SwingConstans.VERTICAL
之一
IllegalArgumentException
- 如果
components
为
null
或包含
null
;或者
axis
不是
SwingConstants.HORIZONTAL
或
SwingConstants.VERTICAL
public void replace(Component existingComponent, Component newComponent)
existingComponent
- 应该被移除并用
newComponent
来替代的组件
newComponent
- 要放入
existingComponent
的位置的组件
IllegalArgumentException
- 如果任一组件为
null
或者
existingComponent
不受此布局管理器管理
public void setLayoutStyle(LayoutStyle layoutStyle)
LayoutStyle
。
null
值指示应该使用
LayoutStyle
的共享实例。
layoutStyle
- 要使用的
LayoutStyle
LayoutStyle
public LayoutStyle getLayoutStyle()
LayoutStyle
,用于计算组件之间的首选间隙。此方法返回指定给
setLayoutStyle
的值,可以为
null
。
LayoutStyle
public void addLayoutComponent(String name, Component component)
Component
添加到父容器的通知。不应该直接调用此方法,而应该使用一个
Group
方法来添加
Component
。
LayoutManager
中的
addLayoutComponent
name
- 要与组件关联的字符串
component
- 要添加的
Component
public void removeLayoutComponent(Component component)
Component
的通知。不应该直接调用此方法,而应该调用父
Container
上的
remove
。
LayoutManager
中的
removeLayoutComponent
component
- 要移除的组件
Component.remove(java.awt.MenuComponent)
public Dimension preferredLayoutSize(Container parent)
LayoutManager
中的
preferredLayoutSize
parent
- 要返回其首选大小的容器
parent
的首选大小
IllegalArgumentException
- 如果
parent
不是创建此 GroupLayout 的相同
Container
IllegalStateException
- 如果添加到此布局的任意组件不同时位于水平组和垂直组中
Container.getPreferredSize()
public Dimension minimumLayoutSize(Container parent)
LayoutManager
中的
minimumLayoutSize
parent
- 要返回其大小的容器
parent
的最小大小
IllegalArgumentException
- 如果
parent
不是创建此 GroupLayout 的相同
Container
IllegalStateException
- 如果添加到此布局的任意组件不同时位于水平组和垂直组中
Container.getMinimumSize()
public void layoutContainer(Container parent)
LayoutManager
中的
layoutContainer
parent
- 要布置的容器
IllegalStateException
- 如果添加到此布局的任意组件不同时位于水平组和垂直组中
public void addLayoutComponent(Component component, Object constraints)
Component
添加到父容器的通知。不应该直接调用此方法,而应该使用一个
Group
方法来添加
Component
。
LayoutManager2
中的
addLayoutComponent
component
- 要添加的组件
constraints
- 组件放置位置的描述
public Dimension maximumLayoutSize(Container parent)
LayoutManager2
中的
maximumLayoutSize
parent
- 要返回其大小的容器
parent
的最大大小
IllegalArgumentException
- 如果
parent
不是创建此 GroupLayout 的相同
Container
IllegalStateException
- 如果添加到此布局的任意组件不同时位于水平组和垂直组中
Container.getMaximumSize()
public float getLayoutAlignmentX(Container parent)