Java布局管理器的5种布局(非常详细,附带实例)
布局管理器是一种用于控制组件在容器中排列和布局的工具。它可以根据容器的大小和组件的特性,自动调整组件的位置和大小,以实现灵活的界面布局。每个容器都有一个默认的布局管理器,开发者可以通过 setLayout() 方法改变容器的布局管理器。
Java 提供多种布局管理器,每种布局管理器都有不同的特点和适用场景。本节介绍 5 种常用的布局管理器类,分别是 FlowLayout(流式布局)、BorderLayout(边界布局)、GridLayout(网格布局)、CardLayout(卡片布局)和 BoxLayOut(盒式布局)。
FlowLayout 类定义在 java.awt 包中,它有三种构造方法:
其中对齐方式 align 的可取值有 FlowLayout.LEFT(左对齐)、FlowLayout.RIGHT(右对齐)、FlowLayout.CENTER(居中对齐)三种形式。例如 new FlowLayout(FlowLayout. LEFT) 就表示创建一个对齐方式为左对齐的 FlowLayout 类实例。
【实例 1】FlowLayout 布局管理器的使用。创建窗体,并以 FlowLayout 作为布局管理器,然后在窗体上放置 4 个命令按钮。
BorderLayout 定义在 java.awt 包中,它有两种构造方法:
在 BorderLayout 布局管理器的管理下,组件通过 add() 方法加入容器中指定的区域。如果在 add() 方法中没有指定将组件放到哪个区域,那么它将会默认地被放置在 Center 区域。
在 BorderLayout 布局管理器的管理下,容器的每个区域只能加入一个组件。如果试图向某个区域加入多个组件,可以在这个区域放置一个中间容器 JPanel 或者 JScrollPane 组件,然后将所需的多个组件放到中间容器中,再把中间容器加入指定的区域,实现复杂的布局。
示例代码如下:
对于东、西、南、北四个边界区域,若某个区域没有被使用,则 Center 区域会扩展并占据这个区域的位置。如果四个边界区域都没有使用,那么 Center 区域将占据整个窗口。
【实例】BorderLayout 布局管理器的使用。创建窗体并以 BorderLayout 的布局放置 7 个命令按钮。
注意,按钮被放置到不同区域。如果改变窗口的大小,由于中间区域 JPanel 采用 FlowLayout 的布局管理,组件的布局会随之改变,其他区域不变。
GridLayout 是一种网格式的布局管理器。它将容器空间划分成若干行乘若干列的网格,而每个组件按添加的顺序从左到右、从上到下占据这些网格,每个组件占据一格。
GridLayout 定义在 java.awt 包中,有三种构造方法,分别如下:
构造方法中的参数 rows 和 cols 两者有一个可以为 0,但是不能同时为 0。当容器增加组件时,容器自动向 0 的那个方向增长。
【实例】GridLayout 布局管理器的使用。创建窗体并以 GridLayout 的布局管理 6 个命令按钮。
注意,组件放入容器中的次序决定了它占据的位置。当容器的大小发生改变时,GridLayout 所管理的组件的相对位置不会发生变化,但组件的大小会随之变化。
例如,使用 first(Container container) 方法显示 container 中的第一个对象,last(Container container) 显示 container 中的最后一个对象,next(Container container) 显示下一个对象,previous(Container container) 显示上一个对象。
CardLayout 类有两个构造方法:
【实例】CardLayout 布局管理器的使用。窗口使用 CardLayout 的布局管理,向其中加入 3 张卡片,每张卡片都是一个命令按钮对象。
注意,在容器中只能看到最上面的一个组件。如果要切换显示其他组件,需要调用 CardLayout 提供的方法。
BoxLayout 类的常用构造方法是:
【实例】BoxLayout 布局管理器的使用。创建窗口,窗口使用 BorderLayout 的布局管理;在窗口中添加两个 JPanel,二者的布局管理器分别采用水平排列和垂直排列的 BoxLayout,再向这两个 JPanel 容器中分别加入三个命令按钮组件,并把这两个 JPanel 容器添加到窗口的北部和中部。
Java 提供多种布局管理器,每种布局管理器都有不同的特点和适用场景。本节介绍 5 种常用的布局管理器类,分别是 FlowLayout(流式布局)、BorderLayout(边界布局)、GridLayout(网格布局)、CardLayout(卡片布局)和 BoxLayOut(盒式布局)。
Java FlowLayout(流式布局)
FlowLayout(流式布局)类的布局策略是将容器看成一个行集,容器中的组件按照加入的先后顺序从左向右排列。当一行排满之后就转到下一行,行高由一行中最高的组件决定。FlowLayout 类是所有 JPanel 的默认布局管理器。FlowLayout 类定义在 java.awt 包中,它有三种构造方法:
- FlowLayout():创建一个使用居中对齐的 FlowLayout 类实例;
- FlowLayout(int align):创建一个指定对齐方式的 FlowLayout 类实例;
- FlowLayout(int align, int hgap, int vgap):创建一个既指定对齐方式又指定组件间隔的 FlowLayout 类的对象。
其中对齐方式 align 的可取值有 FlowLayout.LEFT(左对齐)、FlowLayout.RIGHT(右对齐)、FlowLayout.CENTER(居中对齐)三种形式。例如 new FlowLayout(FlowLayout. LEFT) 就表示创建一个对齐方式为左对齐的 FlowLayout 类实例。
【实例 1】FlowLayout 布局管理器的使用。创建窗体,并以 FlowLayout 作为布局管理器,然后在窗体上放置 4 个命令按钮。
import javax.swing.*; import java.awt.*; public class FlowLayoutDemo extends JFrame { private JButton button1, button2, button3, button4; // 声明 4 个命令按钮对象 public FlowLayoutDemo() { this.setTitle("FlowLayout 布局演示"); // 设置标题 Container container = this.getContentPane(); // 获取 Container 对象 // 设置为 FlowLayout 的布局,JFrame 默认的布局为 BorderLayout container.setLayout(new FlowLayout(FlowLayout.LEFT)); // 创建一个标准命令按钮,按钮上的标签提示信息由构造方法中的参数指定 button1 = new JButton("Button1"); button2 = new JButton("Button2"); button3 = new JButton("Button3"); button4 = new JButton("Button4"); // 将组件添加到内容窗格,组件的大小和位置由 FlowLayout 布局管理器来控制 container.add(button1); container.add(button2); container.add(button3); container.add(button4); this.setVisible(true); // 使窗体显示出来 this.setSize(300, 200); // 设置窗体大小 } public static void main(String[] args) { new FlowLayoutDemo(); } }如果拖动窗口,并改变窗口大小,窗口中的组件位置会随之改变。程序运行结果如下图所示。

Java BorderLayout(边界布局)
BorderLayout(边界布局)是顶层容器 JFrame 的默认布局管理器。它把容器被为东、西、南、北、中五个区域,这五个区域分别用字符串常量 BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH、BorderLayout.CENTER 表示。容器的每个区域只能放一个组件,每加入一个组件时都应该指明把这个组件放到哪个区域。BorderLayout 定义在 java.awt 包中,它有两种构造方法:
- BorderLayout():创建一个各组件间水平、垂直间隔为 0 的 BorderLayout 实例;
- BorderLayout(int hgap, int vgap):创建一个各组件间水平间隔为 hgap、垂直间隔为 vgap 的 BorderLayout 实例。
在 BorderLayout 布局管理器的管理下,组件通过 add() 方法加入容器中指定的区域。如果在 add() 方法中没有指定将组件放到哪个区域,那么它将会默认地被放置在 Center 区域。
在 BorderLayout 布局管理器的管理下,容器的每个区域只能加入一个组件。如果试图向某个区域加入多个组件,可以在这个区域放置一个中间容器 JPanel 或者 JScrollPane 组件,然后将所需的多个组件放到中间容器中,再把中间容器加入指定的区域,实现复杂的布局。
示例代码如下:
JFrame f=new JFrame(“欢迎使用BorderLayout布局”); JButton bt1=new JButton(“button1”); JButton bt2=new JButton(“button2”); JPanel p=new JPanel(); p.add(bt1); p.add(bt2); f.getContentPane().add(p, BorderLayout.SOUTH) ;以上语句实现了将两个按钮 bt1 和 bt2 同时放到窗口的南部区域。
对于东、西、南、北四个边界区域,若某个区域没有被使用,则 Center 区域会扩展并占据这个区域的位置。如果四个边界区域都没有使用,那么 Center 区域将占据整个窗口。
【实例】BorderLayout 布局管理器的使用。创建窗体并以 BorderLayout 的布局放置 7 个命令按钮。
import javax.swing.*; import java.awt.*; public class BorderLayoutDemo extends JFrame { // 声明7个命令按钮对象 private JButton button1, button2, button3, button4, button5, button6, button7; public BorderLayoutDemo() { this.setTitle("欢迎使用 BorderLayout 布局"); // 设置标题 // 获取Container对象,并采用默认布局管理器 BorderLayout Container container = this.getContentPane(); // 创建7个标准命令按钮,按钮上的标签由构造方法中的参数指定 button1 = new JButton("ButtonA"); button2 = new JButton("ButtonB"); button3 = new JButton("ButtonC"); button4 = new JButton("ButtonD"); button5 = new JButton("ButtonE"); button6 = new JButton("ButtonF"); button7 = new JButton("ButtonG"); JPanel p = new JPanel(); // 创建一个中间容器 container.add(button1, BorderLayout.SOUTH); // button1 被放置到南部区域 container.add(button2, BorderLayout.NORTH); // button2 被放置到北部区域 container.add(button3, "East"); // button3 被放置到东部区域 container.add("West", button4); // button4 被放置到西部区域 p.add(button5); p.add(button6); p.add(button7); // 把 button5、button6、button7 放到中间容器中 container.add(p); // 把中间容器放到中间区域中 this.setVisible(true); this.setSize(600, 450); } public static void main(String[] args) { new BorderLayoutDemo(); } }程序运行结果如下图所示:

注意,按钮被放置到不同区域。如果改变窗口的大小,由于中间区域 JPanel 采用 FlowLayout 的布局管理,组件的布局会随之改变,其他区域不变。
Java GridLayout(网格布局)
如果界面上需要放置的组件比较多,且这些组件的大小又基本一致,如计算器、遥控器的面板,那么使用 GridLayout 布局管理器是最佳的选择GridLayout 是一种网格式的布局管理器。它将容器空间划分成若干行乘若干列的网格,而每个组件按添加的顺序从左到右、从上到下占据这些网格,每个组件占据一格。
GridLayout 定义在 java.awt 包中,有三种构造方法,分别如下:
- GridLayout():按默认(1 行 1 列)方式创建一个 GridLayout 布局;
- GridLayout(int rows, int cols):创建一个具有 rows 行、cols 列的 GridLayout 布局;
- GridLayout(int rows, int cols, int hgap, int vgap):按指定的行数 rows、列数 cols、水平间隔 hgap 和垂直间隔 vgap 创建一个 GridLayout 布局。
构造方法中的参数 rows 和 cols 两者有一个可以为 0,但是不能同时为 0。当容器增加组件时,容器自动向 0 的那个方向增长。
【实例】GridLayout 布局管理器的使用。创建窗体并以 GridLayout 的布局管理 6 个命令按钮。
import javax.swing.*; import java.awt.*; public class BorderLayoutDemo extends JFrame { // 声明7个命令按钮对象 private JButton button1, button2, button3, button4, button5, button6, button7; public BorderLayoutDemo() { this.setTitle("欢迎使用 BorderLayout 布局"); // 设置标题 // 获取Container对象,并采用默认布局管理器 BorderLayout Container container = this.getContentPane(); // 创建7个标准命令按钮,按钮上的标签由构造方法中的参数指定 button1 = new JButton("ButtonA"); button2 = new JButton("ButtonB"); button3 = new JButton("ButtonC"); button4 = new JButton("ButtonD"); button5 = new JButton("ButtonE"); button6 = new JButton("ButtonF"); button7 = new JButton("ButtonG"); JPanel p = new JPanel(); // 创建一个中间容器 container.add(button1, BorderLayout.SOUTH); // button1 被放置到南部区域 container.add(button2, BorderLayout.NORTH); // button2 被放置到北部区域 container.add(button3, "East"); // button3 被放置到东部区域 container.add("West", button4); // button4 被放置到西部区域 p.add(button5); p.add(button6); p.add(button7); // 把 button5、button6、button7 放到中间容器中 container.add(p); // 把中间容器放到中间区域中 this.setVisible(true); this.setSize(600, 450); } public static void main(String[] args) { new BorderLayoutDemo(); } }程序运行结果如下图所示:

注意,组件放入容器中的次序决定了它占据的位置。当容器的大小发生改变时,GridLayout 所管理的组件的相对位置不会发生变化,但组件的大小会随之变化。
Java CardLayout(卡片布局)
CardLayout(卡片布局)位于 java.awt 包中。它将每个组件看成一张卡片,如同扑克牌一样将组件堆叠起来,但是只能看到最上面的一个组件,这个被显示的组件占据所有的容器空间。用户可以通过 CardLayout 类提供的方法切换空间中显示的卡片。例如,使用 first(Container container) 方法显示 container 中的第一个对象,last(Container container) 显示 container 中的最后一个对象,next(Container container) 显示下一个对象,previous(Container container) 显示上一个对象。
CardLayout 类有两个构造方法:
- CardLayout():使用默认(间隔为 0)方式创建一个 CardLayout 类对象;
- CardLayout(int hgap, int vgap):创建指定水平间隔和垂直间隔的 CardLayout 类对象。
【实例】CardLayout 布局管理器的使用。窗口使用 CardLayout 的布局管理,向其中加入 3 张卡片,每张卡片都是一个命令按钮对象。
import javax.swing.*; import java.awt.*; public class CardLayoutDemo extends JFrame { private JButton bt1, bt2, bt3; Container container; CardLayout myCard; public CardLayoutDemo() { this.setTitle("欢迎使用 CardLayout 布局管理器 "); container = this.getContentPane(); myCard = new CardLayout(); // 创建 CardLayout 布局管理器对象 container.setLayout(myCard); // 设置布局管理器 // 创建 3 个 JButton 对象 bt1 = new JButton("ButtonA"); bt2 = new JButton("ButtonB"); bt3 = new JButton("ButtonC"); // 将每个 JButton 对象作为一张卡片加入窗口 container.add(bt1); container.add(bt2); container.add(bt3); this.setVisible(true); this.setSize(300, 200); } public static void main(String[] args) { new CardLayoutDemo(); } }程序执行结果如下图所示:

注意,在容器中只能看到最上面的一个组件。如果要切换显示其他组件,需要调用 CardLayout 提供的方法。
Java BoxLayout(盒式布局)
BoxLayout 位于 javax.swing 包中。它将容器中的组件按水平方向排成一行,或者垂直方向排成一列。当组件排成一行时,每个组件可以有不同的宽度;当排成一列时,每个组件可以有不同的高度。BoxLayout 类的常用构造方法是:
BoxLayout(Container target,int axis)
- target 是容器对象,表示要为哪个容器设置此布局管理器;
- axis 指明 target 中组件的排列方式,其值包括表示水平排列的 BoxLayout.X_AXIS 和表示垂直排列的 BoxLayout.Y_AXIS。
【实例】BoxLayout 布局管理器的使用。创建窗口,窗口使用 BorderLayout 的布局管理;在窗口中添加两个 JPanel,二者的布局管理器分别采用水平排列和垂直排列的 BoxLayout,再向这两个 JPanel 容器中分别加入三个命令按钮组件,并把这两个 JPanel 容器添加到窗口的北部和中部。
import javax.swing.*; import java.awt.*; public class BoxLayoutDemo extends JFrame { private JButton button1, button2, button3, button4, button5, button6; Container container; public BoxLayoutDemo() { this.setTitle("欢迎使用 BoxLayout 布局管理器 "); container = this.getContentPane(); // 获取 Container 对象 container.setLayout(new BorderLayout()); // 设置布局 // 声明中间容器 px 并设置布局为水平的 BoxLayout JPanel px = new JPanel(); px.setLayout(new BoxLayout(px, BoxLayout.X_AXIS)); // 创建命令按钮 button1 = new JButton("ButtonA"); button2 = new JButton("ButtonB"); button3 = new JButton("ButtonC"); // 把按钮放到中间容器 px 中 px.add(button1); px.add(button2); px.add(button3); // 把中间容器 px 放到北部区域 container.add(px, BorderLayout.NORTH); // 声明中间容器 py,并设置布局为垂直的 BoxLayout JPanel py = new JPanel(); py.setLayout(new BoxLayout(py, BoxLayout.Y_AXIS)); button4 = new JButton("ButtonD"); button5 = new JButton("ButtonE"); button6 = new JButton("ButtonF"); // 把按钮放到中间容器 py 中 py.add(button4); py.add(button5); py.add(button6); // 把中间容器 py 放置到中间区域 container.add(py, BorderLayout.CENTER); this.setVisible(true); // 显示窗口 this.setSize(600, 450); // 设置窗口大小 } public static void main(String[] args) { new BoxLayoutDemo(); } }程序执行结果如下图所示:
