模块  java.desktop
软件包  java.awt

Class GridBagLayout

  • 实现的所有接口
    LayoutManagerLayoutManager2Serializable

    public class GridBagLayout
    extends Object
    implements LayoutManager2, Serializable
    GridBagLayout类是一个灵活的布局管理器,可以垂直,水平或沿着基线对齐组件,而不需要组件具有相同的大小。 每个GridBagLayout对象维护一个动态的矩形单元格网格,每个组件占据一个或多个单元格,称为其显示区域

    GridBagLayout管理的每个组件都与GridBagConstraints的实例相关联。 约束对象指定组件的显示区域应位于网格上的位置以及组件应如何定位在其显示区域内。 除了约束对象之外, GridBagLayout还会考虑每个组件的最小和首选大小,以确定组件的大小。

    网格的整体方向取决于容器的ComponentOrientation属性。 对于水平从左到右的方向,网格坐标(0,0)位于容器的左上角,x向右增加,y向下增加。 对于水平的从右到左的方向,网格坐标(0,0)位于容器的右上角,x向左增加,y向下增加。

    要有效地使用网格包布局,必须自定义与其组件关联的一个或多个GridBagConstraints对象。 您可以通过设置一个或多个实例变量来自定义GridBagConstraints对象:

    GridBagConstraints.gridxGridBagConstraints.gridy
    指定包含组件的显示区域,在此,网格的原点的单元地址的前角细胞gridx = 0gridy = 0 对于水平从左到右的布局,组件的前角是其左上角。 对于水平的从右到左布局,组件的前角是其右上角。 使用GridBagConstraints.RELATIVE (默认值)指定组件紧跟在(沿x轴为gridx或y轴为gridy )之后gridy在添加此组件之前添加到容器的组件。
    GridBagConstraints.gridwidthGridBagConstraints.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.ipadxGridBagConstraints.ipady
    指定组件在布局中的内部填充,添加到组件的最小大小的程度。 组件的宽度至少为其最小宽度加上ipadx像素。 同样,组件的高度至少应为最小高度加上ipady像素。
    GridBagConstraints.insets
    指定组件的外部填充,即组件与其显示区域边缘之间的最小空间量。
    GridBagConstraints.anchor
    指定组件在其显示区域中的位置。 有三种可能的值:绝对值,方向相对值和基线相对值方向相对值相对于容器的ComponentOrientation属性进行解释,而绝对值则不是。 相对于基线计算基线相对值。 有效值为: Absolute, relative and baseline values as described above

    Absolute Values

    Orientation Relative Values

    Baseline Relative Values

    • GridBagConstraints.NORTH
    • GridBagConstraints.SOUTH
    • GridBagConstraints.WEST
    • GridBagConstraints.EAST
    • GridBagConstraints.NORTHWEST
    • GridBagConstraints.NORTHEAST
    • GridBagConstraints.SOUTHWEST
    • GridBagConstraints.SOUTHEAST
    • GridBagConstraints.CENTER (the default)
    • 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.weightxGridBagConstraints.weighty
    用于确定如何分配空间,这对于指定调整大小行为很重要。 除非为一行( weightx )和列( weighty )中的至少一个组件指定权重,否则所有组件在其容器的中心聚集在一起。 这是因为GridBagLayout重为零(默认值)时, GridBagLayout对象会在其单元格网格与容器边缘之间放置任何额外空间。

    每行可能有一个基线; 基线是由该行中具有有效基线和沿基线对齐(该组件的锚定值中的一个的分量确定BASELINEBASELINE_LEADINGBASELINE_TRAILING )。 如果行中没有任何组件具有有效基线,则该行没有基线。

    如果组件跨越行,则它与起始行的基线(如果基线调整大小行为为CONSTANT_ASCENT )或结束行(如果基线调整大小行为为CONSTANT_DESCENTCONSTANT_DESCENT 组件对齐的称为主要行

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

    Baseline Layout The following text describes this graphic (Figure 1).
    此布局包含三个组件:
    • 从第0行开始到第1行结束的面板。该面板的基线调整大小行为为CONSTANT_DESCENT ,锚点为BASELINE 由于基线调整大小的行为是CONSTANT_DESCENT ,因此面板的主要行是第1行。
    • 两个按钮,每个按钮的基线调整大小为CENTER_OFFSET ,锚点为BASELINE
    因为第二个按钮和面板共享相同的主要行,所以它们都沿着它们的基线对齐。

    使用其中一个基线相对值定位的组件调整大小与使用绝对或方向相对值定位时不同。 组件如何变化取决于主要行的基线如何变化。 如果具有相同主要行的任何组件具有基线调整大小行为CONSTANT_DESCENT ,则基线锚定到显示区域的CONSTANT_DESCENT ,否则基线锚定到显示区域的顶部。 以下规则规定了resize行为:

    • 位于基线上方的可调整大小的组件只能增长到与基线一样高。 例如,如果基线为100并且锚定在顶部,则位于基线上方的可调整大小的组件永远不会超过100个单位。
    • 类似地,位于基线下方的可调整大小的组件只能增长到显示高度和基线之间的差异。
    • 如果调整大小的基线适合显示区域,则仅调整位于基线上的可调整大小的组件,其基线调整大小行为为OTHER 如果基线不适合显示区域,则不会调整组件的大小。
    • 位于基线上且没有基线调整大小行为OTHER只能增长到display height - baseline + baseline of component
    如果沿基线定位组件,但组件没有有效基线,则它将在其空间中垂直居中。 类似地,如果您已经相对于基线定位了一个组件,并且该行中没有任何组件具有有效基线,则该组件将垂直居中。

    下图显示了由网格包布局管理的十个组件(所有按钮)。 图2显示了水平,从左到右容器的布局,图3显示了从右到左的水平容器的布局。

    Figures The preceding text describes this graphic (Figure 1). The preceding text describes this graphic (Figure 2). Figure 2: Horizontal, Left-to-Right Figure 3: Horizontal, Right-to-Left

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

    • Button1,Button2,Button3: weightx = 1.0
    • 将Button4: weightx = 1.0gridwidth = GridBagConstraints.REMAINDER
    • Button5: gridwidth = GridBagConstraints.REMAINDER
    • Button6: gridwidth = GridBagConstraints.RELATIVE
    • Button7: gridwidth = GridBagConstraints.REMAINDER
    • 按钮8: gridheight = 2weighty = 1.0
    • Button9,Button 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
    另请参见:
    GridBagConstraintsGridBagLayoutInfoComponentOrientationSerialized Form
    • 字段详细信息

      • MAXGRIDSIZE

        protected static final int MAXGRIDSIZE
        此字段不再用于保留数组并保持向后兼容性。 以前,这是网格袋布局可以布置的最大网格位置数(水平和垂直)。 当前的实现不会对网格的大小施加任何限制。
        另请参见:
        常数字段值
      • MINSIZE

        protected static final int MINSIZE
        可以通过网格布局布局的最小网格。
        另请参见:
        常数字段值
      • PREFERREDSIZE

        protected static final int PREFERREDSIZE
        网格包布局可以布置的首选网格大小。
        另请参见:
        常数字段值
      • layoutInfo

        protected GridBagLayoutInfo layoutInfo
        该字段保存网格包的布局信息。 此字段中的信息基于最近验证的gridbag。 如果layoutInfonull ,则表示null中没有组件或者是否存在组件,它们尚未经过验证。
        另请参见:
        getLayoutInfo(Container, int)
      • columnWidths

        public int[] columnWidths
        此字段包含列最小宽度的覆盖。 如果此字段为非null ,则在计算完所有最小列宽后,将值应用于网格包。 如果columnWidths的元素数多于列数,则将列添加到gridbag以匹配columnWidth中的元素数。
        另请参见:
        getLayoutDimensions()
      • rowHeights

        public int[] rowHeights
        该字段包含行最小高度的覆盖。 如果此字段为非null ,则在计算所有最小行高后,将值应用于网格包。 如果rowHeights具有的元素数多于行数,则会将行添加到rowHeights以匹配rowHeights的元素rowHeights
        另请参见:
        getLayoutDimensions()
      • columnWeights

        public double[] columnWeights
        此字段包含列权重的覆盖。 如果此字段为非null ,则在计算完所有列权重后,将值应用于网格包。 如果列i的重量为columnWeights[i] >则为列i分配权重columnWeights[i] 如果columnWeights元素数多于列数,则忽略多余的元素 - 它们不会导致创建更多列。
      • rowWeights

        public double[] rowWeights
        此字段包含行权重的覆盖。 如果此字段为非null ,则在计算完所有行权重后,将值应用于网格包。 如果行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 ,则返回一组默认值GridBagConstraints compnull无效并返回null

        参数
        comp - 要查询的组件
        结果
        指定组件的约束
      • getLayoutOrigin

        public Point getLayoutOrigin()
        在目标容器的图形坐标空间中确定布局区域的原点。 此值表示布局区域左上角的像素坐标,与容器的ComponentOrientation值无关。 这与单元坐标(0,0)给出的网格原点不同。 大多数应用程序不直接调用此方法。
        结果
        布局网格左上角单元格的图形原点
        从以下版本开始:
        1.1
        另请参见:
        ComponentOrientation
      • 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位于布局下方,则y行数。 容器的方向由其ComponentOrientation属性决定。

        参数
        x - 一个点的 x坐标
        y - 一个点的 y坐标
        结果
        一对有序的索引,指示布局网格中的哪个单元格包含点( xy )。
        从以下版本开始:
        1.1
        另请参见:
        ComponentOrientation
      • addLayoutComponent

        public void addLayoutComponent​(String name,
                                       Component comp)
        没有效果,因为此布局管理器不使用每个组件的字符串。
        Specified by:
        addLayoutComponent在界面 LayoutManager
        参数
        name - 与组件关联的字符串
        comp - 要添加的组件
      • addLayoutComponent

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

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

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

        Specified by:
        minimumLayoutSize接口 LayoutManager
        参数
        parent - 要在其中执行布局的容器
        结果
        parent容器的最小尺寸
        另请参见:
        Container.doLayout()
      • getLayoutAlignmentX

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

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

        public void invalidateLayout​(Container target)
        使布局无效,表明如果布局管理器缓存了信息,则应将其丢弃。
        Specified by:
        invalidateLayout在界面 LayoutManager2
        参数
        target - 目标容器
      • layoutContainer

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

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

        Specified by:
        layoutContainer接口 LayoutManager
        参数
        parent - 要在其中进行布局的容器
        另请参见:
        ContainerContainer.doLayout()
      • 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,width和height字段调整为正确的值。 此方法仅应由GridBagLayout在内部使用。
        参数
        constraints - 要应用的约束
        r - 需要调整的 Rectangle
        从以下版本开始:
        1.4
      • AdjustForGravity

        protected void AdjustForGravity​(GridBagConstraints constraints,
                                        Rectangle r)
        根据约束几何体和打击垫,将x,y,width和height字段调整为正确的值。

        此方法已过时,仅供向后兼容; 新代码应该调用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 - 布局容器