- Swing 简介:什么是 Swing,它有什么特点。
- 核心概念:Swing 的基本架构,如容器、组件、布局管理器。
- 常用组件详解:介绍开发中最高频的 Swing 组件。
- 事件处理:如何让界面响应用户操作(如点击按钮)。
- 完整案例:开发一个功能完整的“学生信息管理系统”登录界面。
- 高级特性与资源:MVC 模式、外观设置、学习资源推荐。
Swing 简介
Swing 是 Java 基础类库的一部分,它是一个用于开发图形用户界面的工具包,它完全用 Java 语言编写,不依赖于本地平台的 GUI,因此具有 “跨平台” 的特性,无论是在 Windows、macOS 还是 Linux 上,其外观和行为都保持一致。

主要特点:
- 轻量级组件:Swing 组件(如
JButton,JTextField)不直接调用操作系统的 GUI API,而是自己绘制,因此称为“轻量级”,与之相对的是 AWT 的“重量级”组件(如Button,TextField)。 - 丰富的组件库:提供了从基础按钮、文本框到复杂表格、树形结构、选项卡等超过 100 种组件。
- 可定制外观:支持“观感”(Look and Feel),可以轻松改变整个应用程序的外观,使其看起来像 Windows、macOS 或 GTK 等不同系统的原生界面。
- 强大的 MVC 架构:Swing 组件大多遵循模型-视图-控制器 设计模式,使得数据和显示逻辑分离,便于开发和维护。
核心概念
在开始写代码前,必须理解三个最基本的概念。
1 容器
容器是能“盛放”其他组件的特殊组件,没有容器,组件就无法在窗口中显示。
-
顶层容器:最外层的窗口,不能被其他容器包含。
(图片来源网络,侵删)JFrame:一个独立的窗口,有标题栏、边框、最小化/最大化/关闭按钮,这是我们创建 GUI 应用程序的主窗口。JDialog:一个对话框窗口,通常用于临时交互,通常依赖于某个JFrame。JApplet:已过时,用于在浏览器中运行 Java 小程序。JWindow:一个无边框、无标题栏的窗口,较少使用。
-
中间容器:用于布局和组合其他组件,必须被放在顶层容器中。
JPanel:最常用的中间容器,默认使用FlowLayout,常用于将相关组件组合在一起。JScrollPane:为组件(如JTextArea或JTable)添加滚动条。JSplitPane:一个分割面板,可以将两个组件水平或垂直地分割开。JTabbedPane:选项卡面板,可以在一个窗口中通过选项卡切换显示不同的内容。
2 组件
组件是 Swing 界面的基本构成元素,如按钮、标签、文本框等,它们被放置在容器中,所有 Swing 组件的根类是 JComponent。
3 布局管理器
布局管理器负责决定容器中组件的位置和大小,Swing 不推荐使用绝对坐标(setBounds(x, y, width, height)),因为这样在不同分辨率和操作系统的屏幕上会显得很奇怪。
常见的布局管理器:
FlowLayout(流式布局):组件从左到右、从上到下像流水一样排列,默认是JPanel的布局。BorderLayout(边界布局):将容器划分为东、南、西、北、中五个区域,每个区域只能放一个组件,是JFrame的默认布局。GridLayout(网格布局):将容器划分为一个 M×N 的网格,每个组件占据一个网格单元。GridBagLayout(网格包布局):最强大也最复杂的布局管理器,允许组件跨越多个网格,并可以精细控制对齐方式。BoxLayout(盒式布局):允许组件在水平或垂直方向上一字排开。GroupLayout:通常与 GUI 设计器(如 NetBeans 或 IntelliJ IDEA 的可视化设计器)配合使用,非常灵活。
常用组件详解
| 组件名称 | 类名 | 功能描述 |
|---|---|---|
| 窗口 | JFrame |
应用程序的主窗口。 |
| 按钮 | JButton |
点击后触发一个动作事件。 |
JLabel |
用于显示文本或图标,不可编辑。 | |
| 文本框 | JTextField |
单行文本输入。 |
| 密码框 | JPasswordField |
单行密码输入,输入时显示遮罩字符(如 )。 |
| 文本区域 | JTextArea |
多行文本编辑区域,不自动换行,通常放入 JScrollPane。 |
| 复选框 | JCheckBox |
提供一个“选中/未选中”的选项。 |
| 单选按钮 | JRadioButton |
在一个 ButtonGroup 中,只能被选中一个。 |
| 下拉列表 | JComboBox |
提供一个下拉菜单供用户选择。 |
| 列表框 | JList |
显示一个可滚动的项目列表,支持多选。 |
| 表格 | JTable |
以二维表格形式显示数据。 |
| 树 | JTree |
以分层结构显示数据。 |
| 菜单栏 | JMenuBar |
窗口顶部的菜单栏。 |
| 菜单 | JMenu |
菜单栏中的下拉菜单,如“文件”、“编辑”。 |
| 菜单项 | JMenuItem |
菜单中的具体选项。 |
事件处理
Swing 使用 事件监听器 模式来处理用户交互,基本步骤如下:
- 创建事件源:比如一个
JButton。 - 创建监听器:实现一个监听器接口(如
ActionListener),并重写其处理方法(如actionPerformed)。 - 注册监听器:调用事件源的
addActionListener()方法,将监听器对象注册到事件源上。
示例:
// 1. 创建事件源
JButton myButton = new JButton("点击我");
// 2. 创建监听器(使用匿名内部类)
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 当按钮被点击时,这段代码会执行
System.out.println("按钮被点击了!");
JOptionPane.showMessageDialog(null, "你好,Swing!");
}
};
// 3. 注册监听器
myButton.addActionListener(listener);
完整案例:学生管理系统登录界面
我们综合运用以上知识,创建一个美观实用的登录界面。
目标界面:
步骤 1:创建主窗口 JFrame
import javax.swing.*;
import java.awt.*;
public class LoginFrame extends JFrame {
public LoginFrame() {
// 1. 设置窗口基本属性
setTitle("学生信息管理系统 - 登录");
setSize(400, 300); // 窗口大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
setLocationRelativeTo(null); // 窗口居中显示
// 2. 创建主面板,并设置布局
// 使用 JPanel 和 GroupLayout 可以实现更灵活的布局
JPanel mainPanel = new JPanel();
GroupLayout layout = new GroupLayout(mainPanel);
mainPanel.setLayout(layout);
layout.setAutoCreateGaps(true); // 自动创建组件之间的间隙
layout.setAutoCreateContainerGaps(true); // 自动创建容器与组件之间的间隙
// ... (后续组件将添加到 mainPanel)
// 3. 将主面板添加到窗口
this.add(mainPanel);
}
public static void main(String[] args) {
// 在事件调度线程中创建和显示 GUI,这是 Swing 的最佳实践
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LoginFrame().setVisible(true);
}
});
}
}
步骤 2:添加组件并设置布局
我们将使用 GroupLayout 来精确控制组件位置,它需要我们分别定义水平和垂直的组。
// 在 LoginFrame 的构造函数中继续添加
// 3. 创建组件JLabel titleLabel = new JLabel("用户登录");Label.setFont(new Font("微软雅黑", Font.BOLD, 20)); // 设置字体Label.setHorizontalAlignment(SwingConstants.CENTER); // 文 