模块 java.desktop
 java.awt

类 GridBagLayout

java.lang.Object
java.awt.GridBagLayout
所有已实现的接口:
LayoutManager , LayoutManager2 , Serializable

public class GridBagLayout extends Object implements 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 = 0gridy = 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.NORTH
    • GridBagConstraints.SOUTH
    • GridBagConstraints.WEST
    • GridBagConstraints.EAST
    • GridBagConstraints.NORTHWEST
    • GridBagConstraints.NORTHEAST
    • GridBagConstraints.SOUTHWEST
    • GridBagConstraints.SOUTHEAST
    • GridBagConstraints.CENTER(默认值)
  • 方向相对值:
    • GridBagConstraints.PAGE_START
    • GridBagConstraints.PAGE_END
    • GridBagConstraints.LINE_START
    • GridBagConstraints.LINE_END
    • GridBagConstraints.FIRST_LINE_START
    • GridBagConstraints.FIRST_LINE_END
    • GridBagConstraints.LAST_LINE_START
    • GridBagConstraints.LAST_LINE_END
  • 基线相对值:
    • GridBagConstraints.BASELINE
    • GridBagConstraints.BASELINE_LEADING
    • GridBagConstraints.BASELINE_TRAILING
    • GridBagConstraints.ABOVE_BASELINE
    • GridBagConstraints.ABOVE_BASELINE_LEADING
    • GridBagConstraints.ABOVE_BASELINE_TRAILING
    • GridBagConstraints.BELOW_BASELINE
    • GridBagConstraints.BELOW_BASELINE_LEADING
    • GridBagConstraints.BELOW_BASELINE_TRAILING
GridBagConstraints.weightx , GridBagConstraints.weighty
用于确定如何分配空间,这对于指定调整大小行为很重要。除非您为一行 (weightx) 和列 (weighty) 中的至少一个组件指定权重,否则所有组件都会聚集在其容器的中心。这是因为当权重为零(默认值)时,GridBagLayout 对象会在其单元格网格和容器边缘之间放置任何额外空间。

每行可能有一个基线;基线由该行中具有有效基线并沿基线对齐的组件确定(组件的锚值是 BASELINEBASELINE_LEADINGBASELINE_TRAILING 之一)。如果行中的所有组件都没有有效基线,则该行没有基线。

如果组件跨行,则它与起始行的基线(如果基线调整行为是 CONSTANT_ASCENT )或结束行(如果基线调整行为是 CONSTANT_DESCENT )对齐。组件对齐的行称为 prevailing row

下图显示了基线布局并包含一个跨行的组件:

The following text describes this graphic (Figure 1).

此布局由三个部分组成:
  • 从第 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 显示了一个水平的、从右到左的容器的布局。

The preceding text describes this graphic (Figure 2).

图 2:水平,从左到右

The preceding text describes this graphic (Figure 3).

图 3:水平,从右到左


十个组件中的每一个都将其关联的 GridBagConstraints 对象的 fill 字段设置为 GridBagConstraints.BOTH 。此外,组件具有以下非默认约束:

  • 按钮 1、按钮 2、按钮 3:weightx = 1.0
  • 按钮 4:weightx = 1.0gridwidth = GridBagConstraints.REMAINDER
  • 按钮 5:gridwidth = GridBagConstraints.REMAINDER
  • 按钮 6:gridwidth = GridBagConstraints.RELATIVE
  • 按钮 7:gridwidth = GridBagConstraints.REMAINDER
  • 按钮 8:gridheight = 2weighty = 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
参见:
  • 字段详细信息

    • MAXGRIDSIZE

      protected static final int MAXGRIDSIZE
      该字段不再用于保留数组,而是为了向后兼容而保留。以前,这是网格包布局可以布置的最大网格位置数(水平和垂直)。当前的实现没有对网格的大小施加任何限制。
      参见:
    • MINSIZE

      protected static final int MINSIZE
      网格包布局所能布局的最小网格。
      参见:
    • PREFERREDSIZE

      protected static final int PREFERREDSIZE
      网格包布局可以布局的首选网格大小。
      参见:
    • comptable

      protected Hashtable <Component ,GridBagConstraints > comptable
      该哈希表维护组件与其 gridbag 约束之间的关联。 comptable 中的键是组件,值是 GridBagConstraints 的实例。
      参见:
    • defaultConstraints

      protected GridBagConstraints  defaultConstraints
      该字段包含一个包含默认值的 gridbag 约束实例,因此如果一个组件没有与其关联的 gridbag 约束,那么该组件将被分配一个 defaultConstraints 的副本。
      参见:
    • layoutInfo

      protected GridBagLayoutInfo  layoutInfo
      该字段包含 gridbag 的布局信息。此字段中的信息基于 gridbag 的最新验证。如果 layoutInfonull,这表明网格包中没有组件,或者如果有组件,则它们尚未经过验证。
      参见:
    • 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

      public void setConstraints(Component  comp, GridBagConstraints  constraints)
      设置此布局中指定组件的约束。
      参数:
      comp - 要修改的组件
      constraints - 要应用的约束
    • getConstraints

      public GridBagConstraints  getConstraints(Component  comp)
      获取指定组件的约束。返回实际 GridBagConstraints 对象的副本。
      参数:
      comp - 要查询的组件
      返回:
      此网格包布局中指定组件的约束;返回实际约束对象的副本
    • lookupConstraints

      protected GridBagConstraints  lookupConstraints(Component  comp)
      检索指定组件的约束。返回值不是副本,而是布局机制使用的实际 GridBagConstraints 对象。

      如果 comp 不在 GridBagLayout 中,则返回一组默认值 GridBagConstraintsnullcomp 值无效并返回 null

      参数:
      comp - 要查询的组件
      返回:
      指定组件的约束
    • getLayoutOrigin

      public Point  getLayoutOrigin()
      在目标容器的图形坐标空间中确定布局区域的原点。该值表示布局区域左上角的像素坐标,与容器的ComponentOrientation值无关。这与单元格坐标 (0,0) 给出的网格原点不同。大多数应用程序不直接调用此方法。
      返回:
      布局网格左上角单元格的图形原点
      自从:
      1.1
      参见:
    • getLayoutDimensions

      public int[][] getLayoutDimensions()
      确定布局网格的列宽和行高。

      大多数应用程序不直接调用此方法。

      返回:
      两个数组的数组,包含布局列的宽度和布局行的高度
      自从:
      1.1
    • getLayoutWeights

      public double[][] getLayoutWeights()
      确定布局网格的列和行的权重。如果布局有额外的空间可以填充,权重用于计算给定的列或行超出其首选大小的程度。

      大多数应用程序不直接调用此方法。

      返回:
      两个数组的数组,表示布局列的水平权重和布局行的垂直权重
      自从:
      1.1
    • location

      public Point  location(int x, int y)
      确定布局网格中的哪个单元格包含 (x, y) 指定的点。每个单元格由其列索引(范围从 0 到列数减 1)和行索引(范围从 0 到行数减1)标识。

      如果 (x, y) 点位于网格之外,则使用以下规则。如果 x 位于从左到右容器布局的左侧或从右到左容器布局右侧,则列索引返回为零。如果 x 在从左到右的容器中位于布局的右侧,或者在从右到左的容器中位于左侧,则列索引将作为列数返回。如果 y 位于布局上方,则行索引返回为零,如果 y 位于布局下方,则返回行数。容器的方向由其 ComponentOrientation 属性决定。

      参数:
      x - 的x一个点的坐标
      y - 的y一个点的坐标
      返回:
      指示布局网格中哪个单元格包含点的有序索引对(xy).
      自从:
      1.1
      参见:
    • addLayoutComponent

      public void addLayoutComponent(String  name, Component  comp)
      没有效果,因为这个布局管理器不使用每个组件的字符串。
      指定者:
      addLayoutComponent 在接口 LayoutManager
      参数:
      name - 要与组件关联的字符串
      comp - 要添加的组件
    • addLayoutComponent

      public void addLayoutComponent(Component  comp, Object  constraints)
      使用指定的 constraints 对象将指定的组件添加到布局中。请注意,约束是可变的,因此在缓存时会被克隆。
      指定者:
      addLayoutComponent 在接口 LayoutManager2
      参数:
      comp - 要添加的组件
      constraints - 确定如何将组件添加到布局的对象
      抛出:
      IllegalArgumentException - 如果 constraints 不是 GridBagConstraint
    • removeLayoutComponent

      public void removeLayoutComponent(Component  comp)
      从此布局中移除指定的组件。

      大多数应用程序不直接调用此方法。

      指定者:
      removeLayoutComponent 在接口 LayoutManager
      参数:
      comp - 要删除的组件。
      参见:
    • preferredLayoutSize

      public Dimension  preferredLayoutSize(Container  parent)
      使用此网格包布局确定 parent 容器的首选大小。

      大多数应用程序不直接调用此方法。

      指定者:
      preferredLayoutSize 在接口 LayoutManager
      参数:
      parent - 进行布局的容器
      返回:
      parent 容器的首选大小
      参见:
    • minimumLayoutSize

      public Dimension  minimumLayoutSize(Container  parent)
      使用此网格包布局确定 parent 容器的最小尺寸。

      大多数应用程序不直接调用此方法。

      指定者:
      minimumLayoutSize 在接口 LayoutManager
      参数:
      parent - 进行布局的容器
      返回:
      parent 容器的最小尺寸
      参见:
    • maximumLayoutSize

      public Dimension  maximumLayoutSize(Container  target)
      给定指定目标容器中的组件,返回此布局的最大尺寸。
      指定者:
      maximumLayoutSize 在接口 LayoutManager2
      参数:
      target - 需要布局的容器
      返回:
      此布局的最大尺寸
      参见:
    • getLayoutAlignmentX

      public float getLayoutAlignmentX(Container  parent)
      返回沿 x 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。
      指定者:
      getLayoutAlignmentX 在接口 LayoutManager2
      参数:
      parent - 目标容器
      返回:
      0.5f 表示居中
    • getLayoutAlignmentY

      public float getLayoutAlignmentY(Container  parent)
      返回沿 y 轴的对齐方式。这指定组件如何相对于其他组件对齐。该值应为 0 到 1 之间的数字,其中 0 表示沿原点对齐,1 表示离原点最远,0.5 表示居中,等等。
      指定者:
      getLayoutAlignmentY 在接口 LayoutManager2
      参数:
      parent - 目标容器
      返回:
      0.5f 表示居中
    • invalidateLayout

      public void invalidateLayout(Container  target)
      使布局无效,表示如果布局管理器缓存了信息,则应将其丢弃。
      指定者:
      invalidateLayout 在接口 LayoutManager2
      参数:
      target - 目标容器
    • layoutContainer

      public void layoutContainer(Container  parent)
      使用此网格包布局布置指定的容器。此方法重塑指定容器中的组件以满足此 GridBagLayout 对象的约束。

      大多数应用程序不直接调用此方法。

      指定者:
      layoutContainer 在接口 LayoutManager
      参数:
      parent - 进行布局的容器
      参见:
    • toString

      public String  toString()
      返回此网格包布局值的字符串表示形式。
      重写:
      toString 在类 Object
      返回:
      此网格包布局的字符串表示形式。
    • getLayoutInfo

      protected GridBagLayoutInfo  getLayoutInfo(Container  parent, int sizeflag)
      为当前的托管子集填写一个 GridBagLayoutInfo 实例。这需要通过子集三遍:
      1. 找出布局网格的尺寸。
      2. 确定组件占据哪些单元格。
      3. 在行/列之间分配权重和最小大小。
      这也会在第一次遇到所有子级时缓存最小尺寸(因此后续循环不需要再次询问)。

      此方法只能由 GridBagLayout 在内部使用。

      参数:
      parent - 布局容器
      sizeflag - PREFERREDSIZEMINSIZE
      返回:
      子集的 GridBagLayoutInfo
      自从:
      1.4
    • GetLayoutInfo

      protected GridBagLayoutInfo  GetLayoutInfo(Container  parent, int sizeflag)
      此方法已过时,仅用于向后兼容;新代码应该改为调用 getLayoutInfo 。为当前的托管子集填写一个 GridBagLayoutInfo 实例。此方法与 getLayoutInfo 相同;有关详细信息,请参阅 getLayoutInfo 说明。
      参数:
      parent - 布局容器
      sizeflag - PREFERREDSIZEMINSIZE
      返回:
      子集的 GridBagLayoutInfo
    • adjustForGravity

      protected void adjustForGravity(GridBagConstraints  constraints, Rectangle  r)
      根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。此方法只能由 GridBagLayout 在内部使用。
      参数:
      constraints - 要应用的约束
      r - 要调整的 Rectangle
      自从:
      1.4
    • AdjustForGravity

      protected void AdjustForGravity(GridBagConstraints  constraints, Rectangle  r)
      根据约束几何形状和焊盘将 x、y、宽度和高度字段调整为正确的值。

      此方法已过时,仅用于向后兼容;新代码应该改为调用 adjustForGravity 。这个方法和adjustForGravity一样

      参数:
      constraints - 要应用的约束
      r - 要调整的 Rectangle
    • getMinSize

      protected Dimension  getMinSize(Container  parent, GridBagLayoutInfo  info)
      根据来自 getLayoutInfo 的信息计算出父级的最小尺寸。此方法只能由 GridBagLayout 在内部使用。
      参数:
      parent - 布局容器
      info - 此父级的布局信息
      返回:
      包含最小尺寸的 Dimension 对象
      自从:
      1.4
    • GetMinSize

      protected Dimension  GetMinSize(Container  parent, GridBagLayoutInfo  info)
      此方法已过时,仅用于向后兼容;新代码应该改为调用 getMinSize 。这个方法和getMinSize一样
      参数:
      parent - 布局容器
      info - 此父级的布局信息
      返回:
      包含最小尺寸的 Dimension 对象
    • arrangeGrid

      protected void arrangeGrid(Container  parent)
      布置网格。此方法只能由 GridBagLayout 在内部使用。
      参数:
      parent - 布局容器
      自从:
      1.4
    • ArrangeGrid

      protected void ArrangeGrid(Container  parent)
      此方法已过时,仅用于向后兼容;新代码应该改为调用 arrangeGrid 。这个方法和arrangeGrid一样
      参数:
      parent - 布局容器