常用布局管理器

开发 Swing 程序时,在容器中使用布局管理器能够设置窗体的布局,进而控制 Swing 组件的位置和大小。Swing 常用的布局管理器为绝对布局管理器、流布局管理器、边界布局管理器和网格布局管理器。

null绝对布局管理器

绝对布局也叫 null 布局,其特点是硬性指定组件在容器中的位置和大小,组件的位置通过绝对坐标的方式来指定。使用绝对布局首先要使用 Container.setLayout(null) 方法取消容器的布局管理器,然后使用 Component.setBounds(int x, int y, int width, int height) 方法设置每个组件在容器中的位置和大小。

【例18.7】使用绝对布局定位按钮位置和大小(实例位置:资源包\TM\sl\18\7)

创建继承 JFrame 窗体的 AbsolutePosition 类,设置布局管理器为绝对布局,在窗体中创建两个按钮组件,将按钮分别定位在不同的位置上。

import java.awt.*;
import javax.swing.*;
public class AbsolutePosition extends JFrame {
    public AbsolutePosition() {
        setTitle("本窗体使用绝对布局");               // 窗体标题
        setLayout(null);                              // 使用null布局
        setBounds(0, 0, 300, 150);                  // 设置窗体的坐标与宽高
        Container c = getContentPane();            // 获取主容器
        JButton b1 = new JButton("按钮1");          // 创建按钮
        JButton b2 = new JButton("按钮2"); 
        b1.setBounds(10, 30, 80, 30);               // 设置按钮的位置与大小
        b2.setBounds(60, 70, 100, 20);
        c.add(b1); // 将按钮添加到容器中
        c.add(b2);
        setVisible(true);                               // 使窗体可见
      
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);   // 关闭窗体则停止程序
    }
    public static void main(String[] args) {
        new AbsolutePosition();
    }
}

运行结果如图18.9所示。

image 2024 03 05 21 25 55 380
Figure 1. 图18.9 使用绝对布局设置两个按钮在窗体中的位置

FlowLayout流布局管理器

流布局(FlowLayout)管理器是 Swing 中最基本的布局管理器。使用流布局管理器摆放组件时,组件被从左到右摆放。当组件占据了当前行的所有空间时,溢出的组件会被移动到当前行的下一行。默认情况下,行组件的排列方式被指定为居中对齐,但是通过设置可以更改每一行组件的排列方式。

FlowLayout 类具有以下常用的构造方法:

  • public FlowLayout()。

  • public FlowLayout(int alignment)。

  • public FlowLayout(int alignment,int horizGap,int vertGap)。

构造方法中的 alignment 参数表示使用流布局管理器时每一行组件的排列方式,该参数可以被赋予 FlowLayout.LEFT、FlowLayout.CENTER 或 FlowLayout.RIGHT,这 3 个值的详细说明如表18.4所示。

image 2024 03 05 21 28 54 256
Figure 2. 表18.4 ailgnment参数值及其说明

在 public FlowLayout(int alignment, int horizGap, int vertGap) 构造方法中,还存在 horizGap 与 vertGap 两个参数,这两个参数分别以像素为单位指定组件与组件之间的水平间隔与垂直间隔。

【例18.8】使用流布局排列按钮(实例位置:资源包\TM\sl\18\8)

创建 FlowLayoutPosition 类,并继承 JFrame 类。设置当前窗体的布局管理器为流布局管理器,运行程序后调整窗体大小,查看流布局管理器对组件的影响。

import java.awt.*;
import javax.swing.*;
public class FlowLayoutPosition extends JFrame {
    public FlowLayoutPosition() {
        setTitle("本窗体使用流布局管理器");       // 设置窗体标题
        Container c = getContentPane();
        // 窗体使用流布局,组件右对齐,组件之间的水平间隔为10像素,垂直间隔10像素
        setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
        for (int i = 0; i < 10; i++) {        // 在容器中循环添加10个按钮
            c.add(new JButton("button" + i));
        }
        setSize(300, 200);                    // 设置窗体大小
       
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 关闭窗体则停止程序
        setVisible(true);                    // 设置窗体可见
    }
    public static void main(String[] args) {
        new FlowLayoutPosition();
    }
}

运行结果如图18.10所示,使用鼠标改变窗体大小,组件的摆放位置也会相应地发生变化。

BorderLayout边界布局管理器

使用 Swing 创建窗体后,容器默认的布局管理器是边界布局(BorderLayout)管理器,边界布局管理器把容器划分为东、南、西、北、中5个区域,如图18.11所示。

image 2024 03 05 21 33 22 311
Figure 3. 图18.10 使用流布局管理器摆放按钮和改变窗体大小后的效果
image 2024 03 05 21 33 48 318
Figure 4. 图18.11 边界布局管理器的区域划分

当组件被添加到被设置为边界布局管理器的容器时,需要使用 BorderLayout 类中的成员变量指定被添加的组件在边界布局管理器中的区域,BorderLayout 类中的成员变量及其说明如表18.5所示。

image 2024 03 05 21 34 23 704
Figure 5. 表18.5 BorderLayout类中的成员变量及其说明

当向使用了边界布局管理器的容器中添加组件时:如果不指定要把组件添加到哪个区域,那么当前组件会被默认添加到 CENTER 区域;如果向同一个区域中添加多个组件,那么后放入的组件会覆盖先放入的组件。

add() 方法用于实现向容器中添加组件的功能,它可以设置组件的摆放位置。add() 方法常用的语法格式如下:

     public void add(Component comp,Object constraints)
  • comp:被添加的组件。

  • constraints:被添加组件的布局约束对象。

【例18.9】使用边界布局排列按钮(实例位置:资源包\TM\sl\18\9)

创建 BorderLayoutPosition 类,并继承 JFrame 类,设置该窗体的布局管理器为边界布局管理器,分别在窗体的中部、北部、南部、西部、东部添加 5 个按钮。

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

public class BorderLayoutPosition extends JFrame {
	public BorderLayoutPosition() {
		setTitle("这个窗体使用边界布局管理器");
		Container c = getContentPane(); // 获取主容器
		setLayout(new BorderLayout()); // 容器使用边界布局
		JButton centerBtn = new JButton("中");
		JButton northBtn = new JButton("北");
		JButton southBtn = new JButton("南");
		JButton westBtn = new JButton("西");
		JButton eastBtn = new JButton("东");
		c.add(centerBtn, BorderLayout.CENTER); // 中部添加按钮
		c.add(northBtn, BorderLayout.NORTH); // 北部添加按钮
		c.add(southBtn, BorderLayout.SOUTH); // 南部添加按钮
		c.add(westBtn, BorderLayout.WEST); // 西部添加按钮
		c.add(eastBtn, BorderLayout.EAST); // 东部添加按钮
		setSize(350, 200); // 设置窗体大小
		setVisible(true); // 设置窗体可见
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // 关闭窗体则停止程序
	}

	public static void main(String[] args) {
		new BorderLayoutPosition();
	}
}

运行结果如图18.12所示。

image 2024 03 05 21 39 24 768
Figure 6. 图18.12 使用边界布局管理器摆放按钮

GridLayout网格布局管理器

网格布局(GridLayout)管理器能够把容器划分为网格,组件可以按行、列进行排列。在网格布局管理器中,网格的个数由行数和列数决定,且每个网格的大小都相同。例如,一个两行两列的网格布局管理器能够产生4个大小相等的网格。组件从网格的左上角开始,按照从左到右、从上到下的顺序被添加到网格中,且每个组件都会填满整个网格。改变窗体大小时,组件的大小也会随之改变。

网格布局管理器主要有以下两个常用的构造方法:

  • public GridLayout(int rows, int columns)。

  • public GridLayout(int rows, int columns, int horizGap, int vertGap)。

其中:参数 rows 和 columns 分别代表网格的行数和列数,这两个参数中只允许有一个参数可以为 0,用于表示一行或一列可以排列任意多个组件;参数 horizGap 和 vertGap 分别代表网格之间的水平间距和垂直间距。

【例18.10】使用网格布局排列按钮(实例位置:资源包\TM\sl\18\10)

创建 GridLayoutPosition 类,并继承 JFrame 类,设置该窗体使用网格布局管理器,实现一个7行3列的网格后,向每个网格中添加按钮组件。

import java.awt.*;
import javax.swing.*;
public class GridLayoutPosition extends JFrame {
    public GridLayoutPosition() {
        Container c = getContentPane();
    	   // 设置容器使用网格布局管理器,设置7行3列的网格。组件间水平间距为5像素,垂直间距为5像素
        setLayout(new GridLayout(7, 3, 5, 5));
        for (int i = 0; i < 20; i++) {
            c.add(new JButton("button" + i));   // 循环添加按钮
        }
        setSize(300, 300);
        setTitle("这是一个使用网格布局管理器的窗体");
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new GridLayoutPosition();
    }
}

运行结果如图18.13所示。当改变窗体的大小时,组件的大小也会随之改变。

image 2024 03 05 21 41 33 532
Figure 7. 图18.13 使用网格布局的窗体即使变型也不会改变组件排列顺序

编程训练(答案位置:资源包\TM\sl\18\编程训练)

【训练3】为“五绝”分配方位 使用边界布局,把《射雕英雄传》中的“东邪”、“西毒”、“南帝”、“北丐”、“中神通” 放置在合适的位置上。

【训练4】展示26个英文字母表 使用网格布局显示26个英文字母的字母表。