自用资料,上传以方便查阅
FlowLayout
概述
FlowLayout 是 JPanel 的默认布局管理器,它按照从左到右、从上到下的顺序排列组件,当一行放不下时会自动换行。
特点
- 简单易用
- 当容器调整大小时,组件会自动重新排列
- 适合排列按钮等小组件
构造方法
// 默认构造方法,居中对齐,水平和垂直间距为5像素
FlowLayout()
// 指定对齐方式
FlowLayout(int align)
// 对齐方式可选:FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT
// 指定对齐方式和间距
FlowLayout(int align, int hgap, int vgap)
示例代码
import javax.swing.*;
import java.awt.*;
public class FlowLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建面板并设置布局
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));
// 添加组件
panel.add(new JButton("按钮 1"));
panel.add(new JButton("按钮 2"));
panel.add(new JButton("按钮 3"));
panel.add(new JButton("按钮 4"));
panel.add(new JButton("长按钮 5"));
frame.add(panel);
frame.setVisible(true);
}
}
BorderLayout
概述
BorderLayout 是 JFrame 的默认布局管理器,它将容器分为五个区域:北(North)、南(South)、东(East)、西(West)和中(Center)。
特点
- 每个区域只能放置一个组件
- 如果没有指定区域,默认放在中间(Center)
- 当调整容器大小时:
- North 和 South 区域水平方向会拉伸,但高度保持不变
- East 和 West 区域垂直方向会拉伸,但宽度保持不变
- Center 区域在水平和垂直方向都会拉伸
构造方法
// 默认构造方法,水平和垂直间距为0
BorderLayout()
// 指定水平和垂直间距
BorderLayout(int hgap, int vgap)
示例代码
import javax.swing.*;
import java.awt.*;
public class BorderLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 容器默认使用 BorderLayout
frame.setLayout(new BorderLayout(5, 5));
// 添加组件到不同区域
frame.add(new JButton("北"), BorderLayout.NORTH);
frame.add(new JButton("南"), BorderLayout.SOUTH);
frame.add(new JButton("东"), BorderLayout.EAST);
frame.add(new JButton("西"), BorderLayout.WEST);
frame.add(new JButton("中心"), BorderLayout.CENTER);
frame.setVisible(true);
}
}
GridLayout
概述
GridLayout 将容器划分为等大小的矩形网格,每个单元格包含一个组件。组件按照从左到右、从上到下的顺序添加到网格中。
特点
- 所有单元格大小相等
- 组件会被拉伸以填满单元格
- 适合创建计算器、键盘等界面
构造方法
// 默认构造方法,单行多列
GridLayout()
// 指定行数和列数
GridLayout(int rows, int cols)
// 如果rows为0,根据组件数量和指定的cols自动计算行数
// 如果cols为0,根据组件数量和指定的rows自动计算列数
// 指定行数、列数和间距
GridLayout(int rows, int cols, int hgap, int vgap)
示例代码
import javax.swing.*;
import java.awt.*;
public class GridLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("GridLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建面板并设置为3行2列的网格布局
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 2, 5, 10));
// 添加组件
panel.add(new JButton("1"));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
panel.add(new JButton("4"));
panel.add(new JButton("5"));
panel.add(new JButton("6"));
frame.add(panel);
frame.setVisible(true);
}
}
GridBagLayout
概述
GridBagLayout 是最复杂但也最灵活的布局管理器。它将容器划分为不规则的网格,允许组件跨越多行或多列,并可以控制组件的对齐方式和填充行为。
特点
- 非常灵活,可以创建复杂的布局
- 使用 GridBagConstraints 对象指定组件的放置规则
- 适合复杂的表单界面
主要约束属性
- gridx, gridy: 组件的网格位置(左上角为0,0)
- gridwidth, gridheight: 组件占用的单元格数量
- weightx, weighty: 额外空间的分配权重
- anchor: 组件在单元格中的对齐方式
- fill: 组件填充单元格的方式(NONE, HORIZONTAL, VERTICAL, BOTH)
- insets: 组件周围的空白
- ipadx, ipady: 组件内部的填充
示例代码
import javax.swing.*;
import java.awt.*;
public class GridBagLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("GridBagLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
// 创建面板并设置为GridBagLayout
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
// 设置默认值
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 5, 5); // 边距
// 添加标签和文本框
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.2;
panel.add(new JLabel("用户名:"), gbc);
gbc.gridx = 1;
gbc.weightx = 0.8;
panel.add(new JTextField(15), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.2;
panel.add(new JLabel("密码:"), gbc);
gbc.gridx = 1;
gbc.weightx = 0.8;
panel.add(new JPasswordField(15), gbc);
// 添加跨两列的按钮
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.CENTER;
panel.add(new JButton("登录"), gbc);
frame.add(panel);
frame.setVisible(true);
}
}
BoxLayout
概述
BoxLayout 是一种简单的布局管理器,它沿着单一轴线(水平或垂直)排列组件。
特点
- 只能在一个方向上排列组件
- 可以添加不同类型的间隔(刚性间隔、弹性间隔等)
- Box 类提供了创建使用 BoxLayout 的容器的便捷方法
构造方法
// 创建BoxLayout(不能直接构造,而是传递给容器)
BoxLayout(Container target, int axis)
// axis可以是:BoxLayout.X_AXIS(水平)或 BoxLayout.Y_AXIS(垂直)
示例代码
import javax.swing.*;
import java.awt.*;
public class BoxLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建垂直Box
Box verticalBox = Box.createVerticalBox();
verticalBox.add(new JButton("按钮 1"));
verticalBox.add(Box.createVerticalStrut(10)); // 固定间隔
verticalBox.add(new JButton("按钮 2"));
verticalBox.add(Box.createVerticalGlue()); // 弹性间隔
verticalBox.add(new JButton("按钮 3"));
// 创建水平Box
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JButton("左"));
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(new JButton("中"));
horizontalBox.add(Box.createRigidArea(new Dimension(20, 0)));
horizontalBox.add(new JButton("右"));
// 将两个Box添加到面板中
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(verticalBox, BorderLayout.WEST);
panel.add(horizontalBox, BorderLayout.SOUTH);
frame.add(panel);
frame.setVisible(true);
}
}
常用的Box间隔方法
- Box.createRigidArea(Dimension): 创建指定大小的固定空间
- Box.createHorizontalStrut(int): 创建固定宽度的水平间隔
- Box.createVerticalStrut(int): 创建固定高度的垂直间隔
- Box.createHorizontalGlue(): 创建水平弹性间隔
- Box.createVerticalGlue(): 创建垂直弹性间隔
CardLayout
概述
CardLayout 是一种特殊的布局管理器,它将组件堆叠在一起,一次只显示一个组件。类似于卡片堆叠,只有顶部的卡片可见。
特点
- 一次只显示一个组件
- 提供方法切换显示的组件
- 适合向导、标签页、多页表单等界面
构造方法
// 默认构造方法
CardLayout()
// 指定水平和垂直间距
CardLayout(int hgap, int vgap)
常用方法
- first(Container): 显示第一个组件
- last(Container): 显示最后一个组件
- next(Container): 显示下一个组件
- previous(Container): 显示前一个组件
- show(Container, String): 显示指定名称的组件
示例代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CardLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("CardLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建卡片布局面板
final CardLayout cardLayout = new CardLayout();
final JPanel cardPanel = new JPanel(cardLayout);
// 创建三个不同的卡片
JPanel card1 = new JPanel();
card1.add(new JLabel("这是第一个卡片"));
card1.setBackground(Color.LIGHT_GRAY);
JPanel card2 = new JPanel();
card2.add(new JLabel("这是第二个卡片"));
card2.setBackground(Color.WHITE);
JPanel card3 = new JPanel();
card3.add(new JLabel("这是第三个卡片"));
card3.setBackground(Color.CYAN);
// 将卡片添加到面板
cardPanel.add(card1, "Card1");
cardPanel.add(card2, "Card2");
cardPanel.add(card3, "Card3");
// 创建控制按钮
JPanel controlPanel = new JPanel();
JButton prevButton = new JButton("上一个");
JButton nextButton = new JButton("下一个");
prevButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.previous(cardPanel);
}
});
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.next(cardPanel);
}
});
controlPanel.add(prevButton);
controlPanel.add(nextButton);
// 添加到框架
frame.add(cardPanel, BorderLayout.CENTER);
frame.add(controlPanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
}
SpringLayout
概述
SpringLayout 是一种基于弹簧和约束的布局管理器,它使用"弹簧"定义组件之间的关系。弹簧可以有一个首选大小、最小大小和最大大小。
特点
- 灵活但复杂
- 可以精确控制组件位置和大小
- 使用 Spring 和 Constraint 对象配置布局
主要概念
- Spring: 表示距离或大小的对象,可以有弹性
- Constraint: 定义组件边缘与另一个组件或容器边缘的关系
示例代码
import javax.swing.*;
import java.awt.*;
import javax.swing.SpringLayout;
public class SpringLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("SpringLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建面板和布局
JPanel panel = new JPanel();
SpringLayout layout = new SpringLayout();
panel.setLayout(layout);
// 添加组件
JLabel nameLabel = new JLabel("姓名:");
JTextField nameField = new JTextField(15);
JLabel emailLabel = new JLabel("邮箱:");
JTextField emailField = new JTextField(15);
JButton submitButton = new JButton("提交");
panel.add(nameLabel);
panel.add(nameField);
panel.add(emailLabel);
panel.add(emailField);
panel.add(submitButton);
// 设置约束
// 姓名标签左上角固定在面板左上角
layout.putConstraint(SpringLayout.WEST, nameLabel, 10, SpringLayout.WEST, panel);
layout.putConstraint(SpringLayout.NORTH, nameLabel, 10, SpringLayout.NORTH, panel);
// 姓名输入框右侧与标签对齐,与标签垂直居中
layout.putConstraint(SpringLayout.WEST, nameField, 10, SpringLayout.EAST, nameLabel);
layout.putConstraint(SpringLayout.NORTH, nameField, 0, SpringLayout.NORTH, nameLabel);
// 邮箱标签在姓名标签下方
layout.putConstraint(SpringLayout.WEST, emailLabel, 0, SpringLayout.WEST, nameLabel);
layout.putConstraint(SpringLayout.NORTH, emailLabel, 20, SpringLayout.SOUTH, nameLabel);
// 邮箱输入框与邮箱标签对齐
layout.putConstraint(SpringLayout.WEST, emailField, 0, SpringLayout.WEST, nameField);
layout.putConstraint(SpringLayout.NORTH, emailField, 0, SpringLayout.NORTH, emailLabel);
// 提交按钮在邮箱输入框下方居中
layout.putConstraint(SpringLayout.NORTH, submitButton, 20, SpringLayout.SOUTH, emailField);
layout.putConstraint(SpringLayout.WEST, submitButton,
(layout.getConstraints(emailField).getX().getValue() / 2),
SpringLayout.WEST, panel);
frame.add(panel);
frame.setVisible(true);
}
}
GroupLayout
概述
GroupLayout 是为GUI构建器设计的,它允许水平和垂直方向上独立定义布局。Java 6 引入了这种布局管理器,主要用于 NetBeans 等 IDE 的 GUI 设计器。
特点
- 独立定义水平和垂直布局
- 使用顺序组和平行组组织组件
- 布局代码较为复杂,通常由 GUI 构建器生成
主要概念
- 顺序组(SequentialGroup): 组件按顺序排列
- 平行组(ParallelGroup): 组件并行排列,可以指定对齐方式
- GroupLayout.Alignment: 对齐方式,如LEADING, TRAILING, CENTER, BASELINE
示例代码
import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import static javax.swing.GroupLayout.Alignment.*;
import static javax.swing.LayoutStyle.ComponentPlacement.*;
public class GroupLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("GroupLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JLabel nameLabel = new JLabel("姓名:");
JTextField nameField = new JTextField(15);
JLabel passwordLabel = new JLabel("密码:");
JPasswordField passwordField = new JPasswordField(15);
JButton loginButton = new JButton("登录");
JButton cancelButton = new JButton("取消");
// 创建GroupLayout
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
// 自动添加间隙
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
// 水平布局
layout.setHorizontalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(TRAILING)
.addComponent(nameLabel)
.addComponent(passwordLabel))
.addGroup(layout.createParallelGroup(LEADING)
.addComponent(nameField)
.addComponent(passwordField)
.addGroup(layout.createSequentialGroup()
.addComponent(loginButton)
.addComponent(cancelButton)))
);
// 垂直布局
layout.setVerticalGroup(
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(nameLabel)
.addComponent(nameField))
.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(passwordLabel)
.addComponent(passwordField))
.addGroup(layout.createParallelGroup(BASELINE)
.addComponent(loginButton)
.addComponent(cancelButton))
);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
OverlayLayout
概述
OverlayLayout 是一种特殊的布局管理器,它将所有子组件堆叠在彼此之上,所有组件共享相同的空间。
特点
- 所有组件重叠显示
- 组件可以设置不同的对齐方式
- 适合创建带有重叠效果的界面
示例代码
import javax.swing.*;
import java.awt.*;
public class OverlayLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("OverlayLayout 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
// 创建面板并设置布局
JPanel panel = new JPanel();
panel.setLayout(new OverlayLayout(panel));
// 创建按钮并设置大小和对齐方式
JButton button1 = new JButton("底层按钮");
button1.setMaximumSize(new Dimension(150, 50));
button1.setBackground(Color.BLUE);
button1.setForeground(Color.WHITE);
button1.setAlignmentX(0.5f); // 居中
button1.setAlignmentY(0.5f);
// 创建标签并设置透明背景
JLabel label = new JLabel("重叠文本");
label.setFont(new Font("Arial", Font.BOLD, 24));
label.setForeground(Color.RED);
label.setAlignmentX(0.5f);
label.setAlignmentY(0.5f);
// 添加组件(按相反的顺序添加,后添加的显示在上层)
panel.add(label);
panel.add(button1);
frame.add(panel);
frame.setVisible(true);
}
}
不使用布局管理器
概述
可以通过设置布局管理器为 null 来禁用布局管理,然后手动指定每个组件的位置和大小。
特点
- 完全控制组件位置和大小
- 不随窗口大小调整而自动调整
- 不推荐用于需要自适应的界面
示例代码
import javax.swing.*;
import java.awt.*;
public class NullLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("无布局管理器示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 创建面板并设置为无布局
JPanel panel = new JPanel();
panel.setLayout(null);
// 添加组件并设置位置和大小
JButton button1 = new JButton("按钮 1");
button1.setBounds(50, 30, 100, 30); // x, y, width, height
JButton button2 = new JButton("按钮 2");
button2.setBounds(200, 30, 100, 30);
JTextField textField = new JTextField();
textField.setBounds(50, 100, 250, 30);
JTextArea textArea = new JTextArea();
textArea.setBounds(50, 150, 250, 100);
panel.add(button1);
panel.add(button2);
panel.add(textField);
panel.add(textArea);
frame.add(panel);
frame.setVisible(true);
}
}
嵌套布局
概述
在实际应用中,通常会结合使用多种布局管理器来创建复杂的界面。这种技术称为嵌套布局。
特点
- 不同的容器可以使用不同的布局管理器
- 可以创建复杂但有条理的界面
- 易于维护和修改
示例代码
import javax.swing.*;
import java.awt.*;
public class NestedLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("嵌套布局示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 主面板使用BorderLayout
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout(10, 10));
// 顶部面板使用FlowLayout
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
topPanel.add(new JLabel("搜索:"));
topPanel.add(new JTextField(20));
topPanel.add(new JButton("查找"));
// 中间面板使用GridLayout
JPanel centerPanel = new JPanel(new GridLayout(2, 2, 5, 5));
centerPanel.add(new JButton("选项 1"));
centerPanel.add(new JButton("选项 2"));
centerPanel.add(new JButton("选项 3"));
centerPanel.add(new JButton("选项 4"));
// 底部面板使用BoxLayout
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));
bottomPanel.add(Box.createHorizontalGlue());
bottomPanel.add(new JButton("确定"));
bottomPanel.add(Box.createRigidArea(new Dimension(10, 0)));
bottomPanel.add(new JButton("取消"));
// 将面板添加到主面板
mainPanel.add(topPanel, BorderLayout.NORTH);
mainPanel.add(centerPanel, BorderLayout.CENTER);
mainPanel.add(bottomPanel, BorderLayout.SOUTH);
frame.add(mainPanel);
frame.setVisible(true);
}
}
总结
Java Swing 提供了丰富的布局管理器,使开发者能够创建各种各样的用户界面。选择适当的布局管理器取决于应用的需求:
- 简单的按钮排列: FlowLayout 或 BoxLayout
- 复杂表单: GridBagLayout 或 组合使用多种布局
- 动态调整大小: BorderLayout 或 GridBagLayout
- 精确控制: SpringLayout 或 null 布局
- 多页面界面: CardLayout
- 表格数据: GridLayout
- 复杂的专业界面: 嵌套使用多种布局管理器
对于大多数应用程序,使用嵌套布局(在不同容器中使用不同的布局管理器)是创建易用且灵活的用户界面的最佳实践。