Java Swing GridBagLayout网格袋布局的实现

1. 布局: GridBagLayout

官方JavaDocsApi: java.awt.GridBagLayout

GridBagLayout,网格袋布局管理器。它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个 GridBagLayout 对象维持一个动态的矩形单元格(动态计算出单个单元格的大小),每个组件占用一个或多个的单元格,该单元格被称为 显示区域。每个组件显示区域按 从左到右,从上到下,依次排列。

2. 约束: GridBagConstraints

GridBagConstraints,封装了若干对组件的约束属性,每个由 GridBagLayout 管理的 组件都关联一个该约束实例,以指定 组件所在显示区域 的具体放置位置,以及 组件在其显示区域中 的对齐方式。

给组件添加约束: GridBagLayout.setConstraints(Component comp, GridBagConstraints c)

PS: 要理解 组件(所在)显示区域(一个或多个单元格组成) 和 组件在其显示区域中的对齐方式 这两个不同的概念。

3. 属性: GridBagConstraints 的属性

下面属性描述中的相关大写字母常量均定义在GridBagConstraints类中。

3.1 显示区域 约束属性

组件的显示区域相关约束属性,直接作用在组件所在显示区域上。

(1)gridx, gridy

组件显示区域 开始显示的位置(单元格坐标),容器左上角第一个单元格位置为 (0, 0),默认值为RELATIVE,表示放置在 “上一个组件”(所在行列最后添加的一个组件)的 “后面”。

(2)gridwidth, gridheight

组件显示区域 水平/竖直方向 所占单元格的个数,默认值为 1,如要占多行/列,需整体结果有足够的行/列。有如下两个常量特殊值可选:

  • REMAINDER: 占完所在行/列余下所有单元格(该值可实现 换行 作用);
  • RELATIVE: 占到所在行/列余下的倒数第二个单元格(使用该值,所在行/列的最后一个单元格需要“合理”安排组件,并手动换行)。

设置该值不能导致 “前面” 或 “后面” 单元格有留空白,否则可能无效。

(3)weightx, weighty

如何 分布额外空间(单元格区域外,容器边缘内 的间隔),当指定行/列中的其中 任意一个 组件的权重(大于0),则该行/列将(和其他行/列按权重比例)分配额外的水平/竖直空间。当权重为 0(默认值)时,则 整个单元格区域 居中于容器中心。

PS: 如果调用了java.awt.Window.pack()方法,该值无效,因为 pack 后已无额外的空间。

3.2 组件 约束属性

组件相关约束属性,直接作用在组件上。

(1)fill

当 显示区域 大小大于 组件 所需要的大小时,组件 在其 显示区域内 的填充方式。可能的值如下:

  • NONE: (默认)不调整组件大小;
  • HORIZONTAL: 加宽组件,使它在水平方向上填满其显示区域,但是不改变高度;
  • VERTICAL: 加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度;
  • BOTH: 使组件完全填满其显示区域。

(2)anchor

组件 在 显示区域内 的位置(对齐方式),可能有如下三种值:

绝对值 相对于方向的值 相对于基线的值
NORTH PAGE_START BASELINE
SOUTH PAGE_END BASELINE_LEADING
WEST LINE_START BASELINE_TRAILING
EAST LINE_END ABOVE_BASELINE
NORTHWEST FIRST_LINE_START ABOVE_BASELINE_LEADING
NORTHEAST FIRST_LINE_END ABOVE_BASELINE_TRAILING
SOUTHWEST LAST_LINE_START BELOW_BASELINE
SOUTHEAST LAST_LINE_END BELOW_BASELINE_LEADING
CENTER(默认值) BELOW_BASELINE_TRAILING

(3)ipadx, ipady

组件的内部填充(可看做是 组件的内边距),即对组件最小大小的添加量。组件的宽度至少为其最小宽度/高度加上 ipadx/ipady 像素。

(4)insets

组件的外部填充(可看做是 组件的外边距,也可看做是 显示区域 的内边距),即 组件 与其 显示区域边缘 之间间距的最小量。

PS: 上面各属性值之间,以及其他因素,有可能存在冲突或不兼容,不一定设置了即有效,建议多做实验,多写测试Demo去尝试。

4. 案例: GridBagLayout使用实例

先展示效果,如下图所示:

各按钮约束参数:

  • Button01, Button02, Button03:默认
  • Button04:gridwidth = REMAINDER、fill = BOTH
  • Button05:gridwidth = REMAINDER、fill = BOTH
  • Button06:gridwidth = RELATIVE、fill = BOTH
  • Button07:gridwidth = REMAINDER
  • Button08:gridheight = 2、fill = BOTH
  • Button09:gridwidth = REMAINDER、fill = BOTH
  • Button10:gridwidth = REMAINDER、fill = BOTH

代码实现:

package com.xiets.swing;

import javax.swing.*;
import java.awt.*;

public class Main {

 public static void main(String[] args) {
  JFrame jf = new JFrame("测试窗口");
  jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  GridBagLayout gridBag = new GridBagLayout(); // 布局管理器
  GridBagConstraints c = null;     // 约束

  JPanel panel = new JPanel(gridBag);

  JButton btn01 = new JButton("Button01");
  JButton btn02 = new JButton("Button02");
  JButton btn03 = new JButton("Button03");
  JButton btn04 = new JButton("Button04");
  JButton btn05 = new JButton("Button05");
  JButton btn06 = new JButton("Button06");
  JButton btn07 = new JButton("Button07");
  JButton btn08 = new JButton("Button08");
  JButton btn09 = new JButton("Button09");
  JButton btn10 = new JButton("Button10");

  /* 添加 组件 和 约束 到 布局管理器 */
  // Button01
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn01, c); // 内部使用的仅是 c 的副本

  // Button02
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn02, c);

  // Button03
  c = new GridBagConstraints();
  gridBag.addLayoutComponent(btn03, c);

  // Button04 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn04, c);

  // Button05 显示区域独占一行(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn05, c);

  // Button06 显示区域占到当前尾倒车第二个单元格(下一个组件后需要手动换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.RELATIVE;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn06, c);

  // Button07 放置在当前行最后一个单元格(换行)
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  gridBag.addLayoutComponent(btn07, c);

  // Button08 显示区域占两列,组件填充显示区域
  c = new GridBagConstraints();
  c.gridheight = 2;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn08, c);

  // Button09 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn09, c);

  // Button10 显示区域占满当前行剩余空间(换行),组件填充显示区域
  c = new GridBagConstraints();
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.fill = GridBagConstraints.BOTH;
  gridBag.addLayoutComponent(btn10, c);

  /* 添加 组件 到 内容面板 */
  panel.add(btn01);
  panel.add(btn02);
  panel.add(btn03);
  panel.add(btn04);
  panel.add(btn05);
  panel.add(btn06);
  panel.add(btn07);
  panel.add(btn08);
  panel.add(btn09);
  panel.add(btn10);

  jf.setContentPane(panel);
  jf.pack();
  jf.setLocationRelativeTo(null);
  jf.setVisible(true);
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java Swing组件BoxLayout布局用法示例

    本文实例讲述了Java Swing组件BoxLayout布局用法.分享给大家供大家参考,具体如下: BoxLayout 可以把控件依次进行水平或者垂直排列布局,这是通过参数 X_AXIS.Y_AXIS 来决定的.X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列.BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列.下面是一个使用 BoxLayout排列控件的例子: JPanel panel

  • JavaSwing GridLayout 网格布局的实现代码

    1. 概述 官方JavaDocsApi: java.awt.GridLayout GridLayout,网格布局管理器.它以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格. 以行数和总数优先: 通过构造方法或 setRows 和 setColumns 方法将行数和列数都设置为非零值时,指定的列数将被忽略.列数通过指定的行数和布局中的组件总数来确定.因此,例如,如果指定了三行和两列,在布局中添加了九个组件,则它们将显示为三行三列.

  • JavaSwing FlowLayout 流式布局的实现

    1. 概述 官方JavaDocsApi: java.awt.FlowLayout FlowLayout,流式布局管理器.按水平方向依次排列放置组件,排满一行,换下一行继续排列.排列方向(左到右 或 右到左)取决于容器的componentOrientation属性(该属性属于Component),它可能的值如下: ComponentOrientation.LEFT_TO_RIGHT(默认) ComponentOrientation.RIGHT_TO_LEFT 同一行(水平方向)的组件的对齐方式由

  • Java编程使用箱式布局管理器示例【基于swing组件】

    本文实例讲述了Java编程使用箱式布局管理器.分享给大家供大家参考,具体如下: 先来看看运行效果: 完整代码如下: package awtDemo; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax

  • java Swing布局管理之BoxLayout布局

    本文为大家解析java Swing布局管理中的BoxLayout布局,供大家参考,具体内容如下 BoxLayout:可以指定在容器中是否对控件进行水平或者垂直放置,比 FlowLayout 要更为灵活 BoxLayout与其他布局管理器稍有不同,必须向其构造函数中传递容器实例的引用,由该容器使用BoxLayout.另外必须指定BoxLayout中组件的布局方式:垂直排列(按列)或水平排列(按行).用水平组件和垂直组件的不同组合嵌套多面板的作用类似于 GridBagLayout,但没那么复杂. 1

  • java中Swing五种常见的布局方式

    1. 边界布局(BorderLayout) 2.流式布局(FlowLayout) 3.网格布局(GridLayout) 4.盒子布局(BoxLaYout) 5.空布局(null) 还有其他两种布局,分别是GridBagLayout(网格包布局).CardLayout(卡片布局) 注意:JFrame和JDialog默认布局为BorderLayout,JPanel和Applet默认布局为FlowLayout 边界布局示例代码: import java.awt.BorderLayout; import

  • Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    本文实例讲述了Java Swing组件布局管理器之FlowLayout(流式布局).分享给大家供大家参考,具体如下: FlowLayout应该是Swing布局管理器学习中最简单.最基础的一个.所谓流式,就是内部控件像水流一样,从前到后按顺序水平排列,直到达到容器的宽度时跳转到第二行.既然是水平排列,那么就存在三种基本的对齐方式:居中对齐(CENTER ).左对齐(LEFT )和右对齐(RIGHT ).然而,FlowLayout还提供两种对齐方式:LEADING,表示控件与容器方向开始边对应:TR

  • Java编程使用卡片布局管理器示例【基于swing组件】

    本文实例讲述了Java编程使用卡片布局管理器.分享给大家供大家参考,具体如下: 运行效果: 完整示例代码: package com.han; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JB

  • Java Swing GridBagLayout网格袋布局的实现

    1. 布局: GridBagLayout 官方JavaDocsApi: java.awt.GridBagLayout GridBagLayout,网格袋布局管理器.它不要求组件的大小相同便可以将组件垂直.水平或沿它们的基线对齐.每个 GridBagLayout 对象维持一个动态的矩形单元格(动态计算出单个单元格的大小),每个组件占用一个或多个的单元格,该单元格被称为 显示区域.每个组件显示区域按 从左到右,从上到下,依次排列. 2. 约束: GridBagConstraints GridBagC

  • Java Swing null绝对布局的实现示例

    1. 概述 官方JavaDocsApi: java.awt.Component,java.awt.Container null,绝对布局.绝对布局没有特定一个布局管理器类来表示,给容器的布局管理器设置为 null,就表示使用绝对布局,即通过设置组件的坐标和宽高来布置组件. 绝对布局需要明确指定每一个组件的坐标和宽高,否则不显示. 对于使用其他布局时给组件设置坐标和宽高,一般会遵循以下两点: 使用其他布局时,如果在窗口显示之后,再添加新组件,则该组件也会被当做绝对布局对待(即需要手动指定坐标和宽高

  • Java Swing SpringLayout弹性布局的实现代码

    1. 概述 官方JavaDocsApi: javax.swing.SpringLayout javax.swing.SpringLayout.Constraints javax.swing.Spring SpringLayout,弹性布局管理器.使用该布局的容器内的 每一个组件或容器都对应着一个约束,通过该约束定义组件或容器四条边的坐标位置 来实现对组件的布局.该布局主要涉及三个类: SpringLayout.SpringLayout.Constraints.Spring,分别表示 布局管理器.

  • Java Swing CardLayout卡片布局的实现示例

    1. 概述 官方JavaDocsApi: javax.swing.CardLayout CardLayout,卡片布局管理器.它将容器中的每个组件看作一张卡片,一次只能看到一张卡片,容器则充当卡片的堆栈,默认显示第一张卡片. CardLayout 构造方法: // 创建一个间距大小为 0 的卡片布局 CardLayout() // 创建一个指定水平/垂直间距大小的卡片布局. CardLayout(int hgap, int vgap) CardLayout 常用方法: // 显示第一张卡片 vo

  • Java Swing BoxLayout箱式布局的实现代码

    1. 概述 官方JavaDocsApi: javax.swing.BoxLayout,javax.swing.Box BoxLayout,箱式布局管理器.它把若干组件按水平或垂直方向依次排列放置.Swing 提供了一个实现了 BoxLayout 的容器组件Box.使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件.用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂. 创建水平/垂直箱容器(Box): // 创

  • Java Swing GroupLayout分组布局的实现代码

    1. 概述 官方JavaDocsApi: javax.swing.GroupLayout GroupLayout,分组布局管理器.它将组建按层次分组,以决定它们在 Container 中的位置.GroupLayout 主要供生成器使用(生成 并行组 和 串行组).分组由GroupLayout.Group类的实例来完成,每个组可以包含任意数量的元素(Group.Component 或 Gap). GroupLayout支持两种组: 串行组 (sequential group):按顺序沿指定方向(水

  • Java Swing树状组件JTree用法实例详解

    本文实例讲述了Java Swing树状组件JTree用法.分享给大家供大家参考,具体如下: 一.简单样式 先看运行效果: TreeNodeDemo.java package awtDemo; import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import j

随机推荐