- 所有已实现的接口:
LayoutManager,LayoutManager2,Serializable
GridBagLayout 类是一个灵活的布局管理器,它可以垂直、水平或沿基线对齐组件,而不要求组件具有相同的大小。每个 GridBagLayout 对象都维护一个动态的矩形单元格网格,每个组件占据一个或多个单元格,称为它的 display area 。
GridBagLayout 管理的每个组件都与 GridBagConstraints 的实例相关联。约束对象指定组件的显示区域在网格上的位置以及组件在其显示区域内的定位方式。除了其约束对象之外,GridBagLayout 还考虑每个组件的最小和首选大小以确定组件的大小。
网格的整体方向取决于容器的 ComponentOrientation 属性。对于从左到右的水平方向,网格坐标 (0,0) 位于容器的左上角,x 向右增加,y 向下增加。对于从右到左的水平方向,网格坐标 (0,0) 位于容器的右上角,x 向左增加,y 向下增加。
要有效地使用网格包布局,您必须自定义一个或多个与其组件关联的 GridBagConstraints 对象。您可以通过设置一个或多个实例变量来自定义 GridBagConstraints 对象:
GridBagConstraints.gridx,GridBagConstraints.gridy-
指定包含组件显示区域前导角的单元格,其中网格原点处的单元格的地址为
gridx = 0、gridy = 0。对于从左到右的水平布局,组件的前导角是其左上角。对于从右到左的水平布局,组件的前导角是其右上角。使用GridBagConstraints.RELATIVE(默认值)指定组件紧随(沿gridx的 x 轴或gridy的 y 轴)在添加此组件之前添加到容器中的组件。 GridBagConstraints.gridwidth,GridBagConstraints.gridheight-
指定组件显示区域中一行(对于
gridwidth)或列(对于gridheight)的单元格数。默认值为 1。使用GridBagConstraints.REMAINDER指定组件的显示区域将从gridx到行中的最后一个单元格(对于gridwidth)或从gridy到列中的最后一个单元格(对于gridheight)。使用GridBagConstraints.RELATIVE指定组件的显示区域将从gridx到其行中最后一个单元格的下一个(对于gridwidth)或从gridy到其列中最后一个单元格的下一个(对于gridheight)。 GridBagConstraints.fill-
当组件的显示区域大于组件请求的大小时使用,以确定是否(以及如何)调整组件的大小。可能的值是
GridBagConstraints.NONE(默认值)、GridBagConstraints.HORIZONTAL(使组件足够宽以水平填充其显示区域,但不要更改其高度)、GridBagConstraints.VERTICAL(使组件足够高以垂直填充其显示区域,但不要更改其宽度)和GridBagConstraints.BOTH(使组件完全填满其显示区域)。 GridBagConstraints.ipadx,GridBagConstraints.ipady-
指定组件在布局中的内部填充,添加到组件最小尺寸的多少。组件的宽度至少是其最小宽度加上
ipadx像素。同样,组件的高度将至少为最小高度加上ipady像素。 GridBagConstraints.insets- 指定组件的外部填充,即组件与其显示区域边缘之间的最小空间量。
GridBagConstraints.anchor-
指定组件在其显示区域中的位置。存在三种可能的值:绝对值、方向相关值和基线相关值。方向相对值是相对于容器的
ComponentOrientation属性解释的,而绝对值则不是。相对于基线计算基线相对值。有效值为:- 绝对值:
GridBagConstraints.NORTHGridBagConstraints.SOUTHGridBagConstraints.WESTGridBagConstraints.EASTGridBagConstraints.NORTHWESTGridBagConstraints.NORTHEASTGridBagConstraints.SOUTHWESTGridBagConstraints.SOUTHEASTGridBagConstraints.CENTER(默认值)
- 方向相对值:
GridBagConstraints.PAGE_STARTGridBagConstraints.PAGE_ENDGridBagConstraints.LINE_STARTGridBagConstraints.LINE_ENDGridBagConstraints.FIRST_LINE_STARTGridBagConstraints.FIRST_LINE_ENDGridBagConstraints.LAST_LINE_STARTGridBagConstraints.LAST_LINE_END
- 基线相对值:
GridBagConstraints.BASELINEGridBagConstraints.BASELINE_LEADINGGridBagConstraints.BASELINE_TRAILINGGridBagConstraints.ABOVE_BASELINEGridBagConstraints.ABOVE_BASELINE_LEADINGGridBagConstraints.ABOVE_BASELINE_TRAILINGGridBagConstraints.BELOW_BASELINEGridBagConstraints.BELOW_BASELINE_LEADINGGridBagConstraints.BELOW_BASELINE_TRAILING
- 绝对值:
GridBagConstraints.weightx,GridBagConstraints.weighty-
用于确定如何分配空间,这对于指定调整大小行为很重要。除非您为一行 (
weightx) 和列 (weighty) 中的至少一个组件指定权重,否则所有组件都会聚集在其容器的中心。这是因为当权重为零(默认值)时,GridBagLayout对象会在其单元格网格和容器边缘之间放置任何额外空间。
每行可能有一个基线;基线由该行中具有有效基线并沿基线对齐的组件确定(组件的锚值是 BASELINE 、 BASELINE_LEADING 或 BASELINE_TRAILING 之一)。如果行中的所有组件都没有有效基线,则该行没有基线。
如果组件跨行,则它与起始行的基线(如果基线调整行为是 CONSTANT_ASCENT )或结束行(如果基线调整行为是 CONSTANT_DESCENT )对齐。组件对齐的行称为 prevailing row 。
下图显示了基线布局并包含一个跨行的组件:

- 从第 0 行开始到第 1 行结束的面板。面板具有
CONSTANT_DESCENT的基线调整大小行为和BASELINE的锚点。由于基线调整大小行为是CONSTANT_DESCENT,面板的主要行是第 1 行。 - 两个按钮,每个按钮具有
CENTER_OFFSET的基线调整大小行为和BASELINE的锚点。
使用基线相对值之一定位的组件调整大小与使用绝对值或方向相对值定位时不同。组件如何变化取决于当前行的基线如何变化。如果具有相同主行的任何组件具有 CONSTANT_DESCENT 的基线调整大小行为,则基线将锚定到显示区域的底部,否则基线将锚定到显示区域的顶部。以下规则规定了调整大小的行为:
- 位于基线上方的可调整大小的组件只能增长到与基线一样高。例如,如果基线为 100 并固定在顶部,则位于基线上方的可调整大小的组件永远不会增长超过 100 个单位。
- 同样,位于基线下方的可调整大小的组件只能增长到显示高度与基线之间的差异。
- 位于基线上且具有
OTHER基线调整大小行为的可调整大小的组件仅在调整大小后的基线适合显示区域时才会调整大小。如果基线不适合显示区域,则不会调整组件的大小。 - 位于基线上但不具有
OTHER基线调整大小行为的组件只能增长到display height - baseline + baseline of component的高度。
下图显示了由网格包布局管理的十个组件(所有按钮)。图 2 显示了一个水平的、从左到右的容器的布局,图 3 显示了一个水平的、从右到左的容器的布局。

图 2:水平,从左到右

图 3:水平,从右到左
十个组件中的每一个都将其关联的 GridBagConstraints 对象的 fill 字段设置为 GridBagConstraints.BOTH 。此外,组件具有以下非默认约束:
- 按钮 1、按钮 2、按钮 3:
weightx = 1.0 - 按钮 4:
weightx = 1.0,gridwidth = GridBagConstraints.REMAINDER - 按钮 5:
gridwidth = GridBagConstraints.REMAINDER - 按钮 6:
gridwidth = GridBagConstraints.RELATIVE - 按钮 7:
gridwidth = GridBagConstraints.REMAINDER - 按钮 8:
gridheight = 2,weighty = 1.0 - 按钮 9、按钮 10:
gridwidth = GridBagConstraints.REMAINDER
以下是实现上述示例的代码:
import java.awt.*;
import java.util.*;
import java.applet.Applet;
public class GridBagEx1 extends Applet {
protected void makebutton(String name,
GridBagLayout gridbag,
GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
public void init() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setFont(new Font("SansSerif", Font.PLAIN, 14));
setLayout(gridbag);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //end row
makebutton("Button4", gridbag, c);
c.weightx = 0.0; //reset to the default
makebutton("Button5", gridbag, c); //another row
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row
makebutton("Button6", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //end row
makebutton("Button7", gridbag, c);
c.gridwidth = 1; //reset to the default
c.gridheight = 2;
c.weighty = 1.0;
makebutton("Button8", gridbag, c);
c.weighty = 0.0; //reset to the default
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.gridheight = 1; //reset to the default
makebutton("Button9", gridbag, c);
makebutton("Button10", gridbag, c);
setSize(300, 100);
}
public static void main(String args[]) {
Frame f = new Frame("GridBag Layout Example");
GridBagEx1 ex1 = new GridBagEx1();
ex1.init();
f.add("Center", ex1);
f.pack();
f.setSize(f.getPreferredSize());
f.show();
}
}
- 自从:
- 1.0
- 参见:
-
字段摘要
字段修饰符和类型Field描述double[]该字段包含对列权重的重写。int[]该字段包含对列最小宽度的重写。protected Hashtable<Component,GridBagConstraints> 该哈希表维护组件与其 gridbag 约束之间的关联。protected GridBagConstraints该字段包含一个包含默认值的 gridbag 约束实例,因此如果一个组件没有与其关联的 gridbag 约束,那么该组件将被分配一个defaultConstraints的副本。protected GridBagLayoutInfo该字段包含 gridbag 的布局信息。protected static final int该字段不再用于保留数组,而是为了向后兼容而保留。protected static final int网格包布局所能布局的最小网格。protected static final int网格包布局可以布局的首选网格大小。int[]该字段包含对行最小高度的重写。double[]该字段包含对行权重的重写。 -
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述voidaddLayoutComponent(Component comp, Object constraints) 使用指定的constraints对象将指定的组件添加到布局中。voidaddLayoutComponent(String name, Component comp) 没有效果,因为这个布局管理器不使用每个组件的字符串。protected voidadjustForGravity(GridBagConstraints constraints, Rectangle r) 根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。protected voidAdjustForGravity(GridBagConstraints constraints, Rectangle r) 根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。protected voidarrangeGrid(Container parent) 布置网格。protected voidArrangeGrid(Container parent) 此方法已过时,仅用于向后兼容;新代码应该改为调用arrangeGrid。getConstraints(Component comp) 获取指定组件的约束。floatgetLayoutAlignmentX(Container parent) 返回沿 x 轴的对齐方式。floatgetLayoutAlignmentY(Container parent) 返回沿 y 轴的对齐方式。int[][]确定布局网格的列宽和行高。protected GridBagLayoutInfogetLayoutInfo(Container parent, int sizeflag) 为当前的托管子集填写一个GridBagLayoutInfo实例。protected GridBagLayoutInfoGetLayoutInfo(Container parent, int sizeflag) 此方法已过时,仅用于向后兼容;新代码应该改为调用getLayoutInfo。在目标容器的图形坐标空间中确定布局区域的原点。double[][]确定布局网格的列和行的权重。protected DimensiongetMinSize(Container parent, GridBagLayoutInfo info) 根据来自getLayoutInfo的信息计算出父级的最小尺寸。protected DimensionGetMinSize(Container parent, GridBagLayoutInfo info) 此方法已过时,仅用于向后兼容;新代码应该改为调用getMinSize。voidinvalidateLayout(Container target) 使布局无效,表示如果布局管理器缓存了信息,则应将其丢弃。voidlayoutContainer(Container parent) 使用此网格包布局布置指定的容器。location(int x, int y) 确定布局网格中的哪个单元格包含(x, y)指定的点。protected GridBagConstraintslookupConstraints(Component comp) 检索指定组件的约束。maximumLayoutSize(Container target) 给定指定目标容器中的组件,返回此布局的最大尺寸。minimumLayoutSize(Container parent) 使用此网格包布局确定parent容器的最小尺寸。preferredLayoutSize(Container parent) 使用此网格包布局确定parent容器的首选大小。void从此布局中移除指定的组件。voidsetConstraints(Component comp, GridBagConstraints constraints) 设置此布局中指定组件的约束。toString()返回此网格包布局值的字符串表示形式。
-
字段详细信息
-
MAXGRIDSIZE
protected static final int MAXGRIDSIZE该字段不再用于保留数组,而是为了向后兼容而保留。以前,这是网格包布局可以布置的最大网格位置数(水平和垂直)。当前的实现没有对网格的大小施加任何限制。- 参见:
-
MINSIZE
protected static final int MINSIZE网格包布局所能布局的最小网格。- 参见:
-
PREFERREDSIZE
protected static final int PREFERREDSIZE网格包布局可以布局的首选网格大小。- 参见:
-
comptable
该哈希表维护组件与其 gridbag 约束之间的关联。comptable中的键是组件,值是GridBagConstraints的实例。- 参见:
-
defaultConstraints
该字段包含一个包含默认值的 gridbag 约束实例,因此如果一个组件没有与其关联的 gridbag 约束,那么该组件将被分配一个defaultConstraints的副本。- 参见:
-
layoutInfo
该字段包含 gridbag 的布局信息。此字段中的信息基于 gridbag 的最新验证。如果layoutInfo是null,这表明网格包中没有组件,或者如果有组件,则它们尚未经过验证。- 参见:
-
columnWidths
public int[] columnWidths该字段包含对列最小宽度的覆盖。如果此字段是非null,则在计算完所有最小列宽后,将值应用于 gridbag。如果 columnWidths 的元素多于列数,则将列添加到 gridbag 以匹配 columnWidth 中的元素数。- 参见:
-
rowHeights
public int[] rowHeights该字段包含对行最小高度的覆盖。如果此字段是非null,则在计算完所有最小行高后,将值应用于 gridbag。如果rowHeights的元素多于行数,则将行添加到 gridbag 以匹配rowHeights中的元素数。- 参见:
-
columnWeights
public double[] columnWeights该字段包含对列权重的覆盖。如果此字段是非null,则在计算所有列权重后将值应用于 gridbag。如果columnWeights[i] >为第 i 列分配权重,则为第 i 列分配columnWeights[i]中的权重。如果columnWeights的元素多于列数,多余的元素将被忽略 - 它们不会导致创建更多的列。 -
rowWeights
public double[] rowWeights该字段包含对行权重的覆盖。如果此字段是非null,则在计算所有行权重后将值应用于 gridbag。如果第 i 行的rowWeights[i] >权重,则为第 i 行分配rowWeights[i]中的权重。如果rowWeights的元素多于行数,多余的元素将被忽略 - 它们不会导致创建更多行。
-
-
构造方法详细信息
-
GridBagLayout
public GridBagLayout()创建一个网格包布局管理器。
-
-
方法详情
-
setConstraints
设置此布局中指定组件的约束。- 参数:
comp- 要修改的组件constraints- 要应用的约束
-
getConstraints
获取指定组件的约束。返回实际GridBagConstraints对象的副本。- 参数:
comp- 要查询的组件- 返回:
- 此网格包布局中指定组件的约束;返回实际约束对象的副本
-
lookupConstraints
检索指定组件的约束。返回值不是副本,而是布局机制使用的实际GridBagConstraints对象。如果
comp不在GridBagLayout中,则返回一组默认值GridBagConstraints。null的comp值无效并返回null。- 参数:
comp- 要查询的组件- 返回:
- 指定组件的约束
-
getLayoutOrigin
在目标容器的图形坐标空间中确定布局区域的原点。该值表示布局区域左上角的像素坐标,与容器的ComponentOrientation值无关。这与单元格坐标 (0,0) 给出的网格原点不同。大多数应用程序不直接调用此方法。- 返回:
- 布局网格左上角单元格的图形原点
- 自从:
- 1.1
- 参见:
-
getLayoutDimensions
public int[][] getLayoutDimensions()确定布局网格的列宽和行高。大多数应用程序不直接调用此方法。
- 返回:
- 两个数组的数组,包含布局列的宽度和布局行的高度
- 自从:
- 1.1
-
getLayoutWeights
public double[][] getLayoutWeights()确定布局网格的列和行的权重。如果布局有额外的空间可以填充,权重用于计算给定的列或行超出其首选大小的程度。大多数应用程序不直接调用此方法。
- 返回:
- 两个数组的数组,表示布局列的水平权重和布局行的垂直权重
- 自从:
- 1.1
-
location
确定布局网格中的哪个单元格包含(x, y)指定的点。每个单元格由其列索引(范围从 0 到列数减 1)和行索引(范围从 0 到行数减1)标识。如果
(x, y)点位于网格之外,则使用以下规则。如果x位于从左到右容器布局的左侧或从右到左容器布局右侧,则列索引返回为零。如果x在从左到右的容器中位于布局的右侧,或者在从右到左的容器中位于左侧,则列索引将作为列数返回。如果y位于布局上方,则行索引返回为零,如果y位于布局下方,则返回行数。容器的方向由其ComponentOrientation属性决定。- 参数:
x- 的x一个点的坐标y- 的y一个点的坐标- 返回:
- 指示布局网格中哪个单元格包含点的有序索引对(x, y).
- 自从:
- 1.1
- 参见:
-
addLayoutComponent
没有效果,因为这个布局管理器不使用每个组件的字符串。- 指定者:
addLayoutComponent在接口LayoutManager中- 参数:
name- 要与组件关联的字符串comp- 要添加的组件
-
addLayoutComponent
使用指定的constraints对象将指定的组件添加到布局中。请注意,约束是可变的,因此在缓存时会被克隆。- 指定者:
addLayoutComponent在接口LayoutManager2中- 参数:
comp- 要添加的组件constraints- 确定如何将组件添加到布局的对象- 抛出:
IllegalArgumentException- 如果constraints不是GridBagConstraint
-
removeLayoutComponent
从此布局中移除指定的组件。大多数应用程序不直接调用此方法。
- 指定者:
removeLayoutComponent在接口LayoutManager中- 参数:
comp- 要删除的组件。- 参见:
-
preferredLayoutSize
使用此网格包布局确定parent容器的首选大小。大多数应用程序不直接调用此方法。
- 指定者:
preferredLayoutSize在接口LayoutManager中- 参数:
parent- 进行布局的容器- 返回:
parent容器的首选大小- 参见:
-
minimumLayoutSize
使用此网格包布局确定parent容器的最小尺寸。大多数应用程序不直接调用此方法。
- 指定者:
minimumLayoutSize在接口LayoutManager中- 参数:
parent- 进行布局的容器- 返回:
parent容器的最小尺寸- 参见:
-
maximumLayoutSize
给定指定目标容器中的组件,返回此布局的最大尺寸。- 指定者:
maximumLayoutSize在接口LayoutManager2中- 参数:
target- 需要布局的容器- 返回:
- 此布局的最大尺寸
- 参见:
-
getLayoutAlignmentX
返回沿 x 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。- 指定者:
getLayoutAlignmentX在接口LayoutManager2中- 参数:
parent- 目标容器- 返回:
-
值
0.5f表示居中
-
getLayoutAlignmentY
返回沿 y 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。- 指定者:
getLayoutAlignmentY在接口LayoutManager2中- 参数:
parent- 目标容器- 返回:
-
值
0.5f表示居中
-
invalidateLayout
使布局无效,表示如果布局管理器缓存了信息,则应将其丢弃。- 指定者:
invalidateLayout在接口LayoutManager2中- 参数:
target- 目标容器
-
layoutContainer
使用此网格包布局布置指定的容器。此方法重塑指定容器中的组件以满足此GridBagLayout对象的约束。大多数应用程序不直接调用此方法。
- 指定者:
layoutContainer在接口LayoutManager中- 参数:
parent- 进行布局的容器- 参见:
-
toString
返回此网格包布局值的字符串表示形式。 -
getLayoutInfo
为当前的托管子集填写一个GridBagLayoutInfo实例。这需要通过子集三遍:- 找出布局网格的尺寸。
- 确定组件占据哪些单元格。
- 在行/列之间分配权重和最小大小。
此方法只能由
GridBagLayout在内部使用。- 参数:
parent- 布局容器sizeflag-PREFERREDSIZE或MINSIZE- 返回:
-
子集的
GridBagLayoutInfo - 自从:
- 1.4
-
GetLayoutInfo
此方法已过时,仅用于向后兼容;新代码应该改为调用getLayoutInfo。为当前的托管子集填写一个GridBagLayoutInfo实例。此方法与getLayoutInfo相同;有关详细信息,请参阅getLayoutInfo说明。- 参数:
parent- 布局容器sizeflag-PREFERREDSIZE或MINSIZE- 返回:
-
子集的
GridBagLayoutInfo
-
adjustForGravity
根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。此方法只能由GridBagLayout在内部使用。- 参数:
constraints- 要应用的约束r- 要调整的Rectangle- 自从:
- 1.4
-
AdjustForGravity
根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。此方法已过时,仅用于向后兼容;新代码应该改为调用
adjustForGravity。这个方法和adjustForGravity一样- 参数:
constraints- 要应用的约束r- 要调整的Rectangle
-
getMinSize
根据来自getLayoutInfo的信息计算出父级的最小尺寸。此方法只能由GridBagLayout在内部使用。- 参数:
parent- 布局容器info- 此父级的布局信息- 返回:
-
包含最小尺寸的
Dimension对象 - 自从:
- 1.4
-
GetMinSize
此方法已过时,仅用于向后兼容;新代码应该改为调用getMinSize。这个方法和getMinSize一样- 参数:
parent- 布局容器info- 此父级的布局信息- 返回:
-
包含最小尺寸的
Dimension对象
-
arrangeGrid
布置网格。此方法只能由GridBagLayout在内部使用。- 参数:
parent- 布局容器- 自从:
- 1.4
-
ArrangeGrid
此方法已过时,仅用于向后兼容;新代码应该改为调用arrangeGrid。这个方法和arrangeGrid一样- 参数:
parent- 布局容器
-