首页 > 编程笔记 > Java笔记 阅读:39

Java布局管理器的5种布局(非常详细,附带实例)

布局管理器是一种用于控制组件在容器中排列和布局的工具。它可以根据容器的大小和组件的特性,自动调整组件的位置和大小,以实现灵活的界面布局。每个容器都有一个默认的布局管理器,开发者可以通过 setLayout() 方法改变容器的布局管理器。

Java 提供多种布局管理器,每种布局管理器都有不同的特点和适用场景。本节介绍 5 种常用的布局管理器类,分别是 FlowLayout(流式布局)、BorderLayout(边界布局)、GridLayout(网格布局)、CardLayout(卡片布局)和 BoxLayOut(盒式布局)。

Java FlowLayout(流式布局)

FlowLayout(流式布局)类的布局策略是将容器看成一个行集,容器中的组件按照加入的先后顺序从左向右排列。当一行排满之后就转到下一行,行高由一行中最高的组件决定。FlowLayout 类是所有 JPanel 的默认布局管理器。

FlowLayout 类定义在 java.awt 包中,它有三种构造方法:
其中对齐方式 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 布局管理器的管理下,组件通过 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 包中,有三种构造方法,分别如下:
构造方法中的参数 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 布局管理器的使用。窗口使用 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)

【实例】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();
    }
}
程序执行结果如下图所示:

相关文章