Java Swing 图形界面编程
一、Swing 是什么?
Swing 是 Java 提供的图形用户界面(GUI)工具包,用来开发桌面应用程序(如记事本、计算器、桌面管理系统)。
Swing 是 javax.swing 包下的类,使用前需要导包。
二、Swing 核心继承结构
plaintext
Component (组件)
↳ Container (容器)
↳ Window (窗口)
↳ JFrame (顶层窗口,最常用)
↳ JComponent (基础组件)
↳ JButton/JLabel/JTextField/JTextArea...
三、开发第一个 Swing 程序(Hello World)
java
运行
import javax.swing.*;
// 第一个Swing窗口
public class FirstSwing {
public static void main(String[] args) {
// Swing 组件建议在事件线程中创建(规范写法)
SwingUtilities.invokeLater(() -> {
// 1. 创建窗口对象
JFrame frame = new JFrame("我的第一个Swing窗口");
// 2. 设置窗口关闭时退出程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 3. 设置窗口大小
frame.setSize(400, 300);
// 4. 创建一个文本标签
JLabel label = new JLabel("Hello Swing!", JLabel.CENTER);
// 5. 把组件添加到窗口
frame.add(label);
// 6. 显示窗口
frame.setVisible(true);
});
}
}
代码说明
JFrame:Swing 顶层窗口,所有组件都放在里面
setDefaultCloseOperation:设置关闭行为(必须写,否则关闭窗口程序不退出)
invokeLater:保证 Swing 组件线程安全(标准写法)
四、Swing 常用组件
1. 标签(JLabel)
显示文本 / 图片,最基础的展示组件:
java
运行
JLabel label = new JLabel("用户名:");
2. 单行输入框(JTextField)
用于输入单行文本:
java
运行
JTextField tf = new JTextField(20); // 20表示宽度
3. 密码框(JPasswordField)
输入密码自动隐藏:
java
运行
JPasswordField pf = new JPasswordField(20);
4. 按钮(JButton)
触发点击事件:
java
运行
JButton btn = new JButton("点击登录");
5. 多行文本域(JTextArea)
显示 / 输入多行文字:
java
运行
JTextArea ta = new JTextArea(5, 20);
ta.setLineWrap(true); // 自动换行
6. 复选框(JCheckBox)
多选:
java
运行
JCheckBox check = new JCheckBox("记住密码");
7. 单选框(JRadioButton)
单选,需要配合 ButtonGroup:
java
运行
JRadioButton male = new JRadioButton("男");
JRadioButton female = new JRadioButton("女");
ButtonGroup group = new ButtonGroup();
group.add(male);
group.add(female);
8. 下拉框(JComboBox)
选择列表:
java
运行
String[] citys = {"北京", "上海", "广州"};
JComboBox<String> cb = new JComboBox<>(citys);
五、布局管理器(控制组件位置)
Swing 布局用来自动排列组件,不用手动写坐标。
1. FlowLayout(流式布局)
从左到右、从上到下排列(默认布局):
java
运行
frame.setLayout(new FlowLayout());
2. BorderLayout(边界布局)
分为 5 个区域:东、西、南、北、中:
java
运行
frame.setLayout(new BorderLayout());
frame.add(btn, BorderLayout.NORTH); // 北部
3. GridLayout(网格布局)
像表格一样排列:
java
运行
// 3行2列
frame.setLayout(new GridLayout(3, 2));
4. GridBagLayout(最灵活)
复杂界面首选,可自由控制大小位置。
六、事件处理(点击按钮做动作)
Swing 核心:用户操作 → 触发事件 → 执行代码
最常用:按钮点击事件(ActionListener)
示例:点击按钮弹出提示框
java
运行
btn.addActionListener(e -> {
JOptionPane.showMessageDialog(frame, "按钮被点击啦!");
});
登录功能示例(获取输入框内容)
java
运行
btnLogin.addActionListener(e -> {
// 获取用户名和密码
String username = tfUser.getText();
String password = new String(pfPwd.getPassword());
if("admin".equals(username) && "123456".equals(password)){
JOptionPane.showMessageDialog(frame, "登录成功!");
}else{
JOptionPane.showMessageDialog(frame, "用户名或密码错误");
}
});
七、实战案例:登录界面
这是最经典的 Swing 实战案例,直接复制运行:
java
运行
import javax.swing.*;
import java.awt.*;
public class LoginFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("用户登录");
frame.setSize(350, 220);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); // 窗口居中
// 创建面板,使用网格布局
JPanel panel = new JPanel(new GridLayout(3, 2, 10, 10));
panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
// 添加组件
panel.add(new JLabel("用户名:"));
JTextField tfUser = new JTextField();
panel.add(tfUser);
panel.add(new JLabel("密 码:"));
JPasswordField pfPwd = new JPasswordField();
panel.add(pfPwd);
JButton btnReset = new JButton("重置");
JButton btnLogin = new JButton("登录");
panel.add(btnReset);
panel.add(btnLogin);
frame.add(panel);
// 登录事件
btnLogin.addActionListener(e -> {
String user = tfUser.getText();
String pwd = new String(pfPwd.getPassword());
if ("admin".equals(user) && "123456".equals(pwd)) {
JOptionPane.showMessageDialog(frame, "登录成功!");
} else {
JOptionPane.showMessageDialog(frame, "账号或密码错误");
}
});
// 重置事件
btnReset.addActionListener(e -> {
tfUser.setText("");
pfPwd.setText("");
});
frame.setVisible(true);
});
}
}
八、Swing 开发小技巧
窗口居中:frame.setLocationRelativeTo(null);
禁止缩放窗口:frame.setResizable(false);
设置图标:frame.setIconImage(new ImageIcon("logo.png").getImage());
弹出对话框:
提示:JOptionPane.showMessageDialog()
确认:JOptionPane.showConfirmDialog()
输入:JOptionPane.showInputDialog()
给组件加边距:setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
