很多人一提到 Java,就想到后端服务、Web 框架或安卓开发。但 Java 的 GUI(图形用户界面)能力同样强大,尤其是 Swing,作为跨平台桌面开发利器,它让我们可以快速构建功能丰富、美观实用的桌面软件。
本篇文章将手把手教你从零开始构建 Java Swing GUI 应用,包括窗口管理、按钮交互、事件监听、布局控制以及实际项目构建,图文并茂,适合入门到中级读者。
特性 | AWT | Swing |
---|---|---|
所属包 | java.awt.* | javax.swing.* |
平台依赖性 | 是(调用原生系统) | 否(纯 Java 实现) |
外观可定制性 | 差 | 好(支持 LookAndFeel) |
组件复杂度 | 简单 | 丰富(支持复杂组件) |
类名 | 用途 |
---|---|
JFrame | 顶级窗口 |
JPanel | 面板容器 |
JButton | 按钮 |
JLabel | 标签文本 |
JTextField | 单行文本框 |
JTextArea | 多行文本区 |
JCheckBox | 多选框 |
JRadioButton | 单选框 |
JList | 列表 |
JTable | 表格 |
java复制编辑import javax.swing.*;
public class HelloSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("Swing 入门");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("你好,Swing!", SwingConstants.CENTER);
frame.add(label);
frame.setVisible(true);
}
}
diff复制编辑+----------------------------------+
| 你好,Swing! |
| |
| |
| |
+----------------------------------+
java复制编辑import javax.swing.*;
import java.awt.event.*;
public class ButtonDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("按钮事件");
JButton button = new JButton("点击我");
JLabel label = new JLabel("尚未点击");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("按钮被点击!");
}
});
frame.setLayout(new java.awt.FlowLayout());
frame.add(button);
frame.add(label);
frame.setSize(300, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
[点击我]
→ 尚未点击
[点击我]
→ 按钮被点击!
布局决定了组件在窗口中的排布方式。
布局管理器 | 描述 |
---|---|
FlowLayout | 流式,从左到右 |
BorderLayout | 东西南北中五个区域 |
GridLayout | 网格布局,等宽高分布 |
BoxLayout | 横向或纵向排列 |
GridBagLayout | 灵活复杂的网格布局 |
java复制编辑JFrame frame = new JFrame("布局示例");
frame.setLayout(new BorderLayout());
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);
java复制编辑import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RegisterForm {
public static void main(String[] args) {
JFrame frame = new JFrame("用户注册");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(5, 2));
JLabel nameLabel = new JLabel("用户名:");
JTextField nameField = new JTextField();
JLabel emailLabel = new JLabel("邮箱:");
JTextField emailField = new JTextField();
JLabel passLabel = new JLabel("密码:");
JPasswordField passField = new JPasswordField();
JButton submit = new JButton("注册");
JLabel result = new JLabel("");
submit.addActionListener(e -> {
String name = nameField.getText();
String email = emailField.getText();
String pass = new String(passField.getPassword());
if (name.isEmpty() || email.isEmpty() || pass.isEmpty()) {
result.setText("请填写所有字段!");
} else {
result.setText("注册成功,欢迎 " + name);
}
});
frame.add(nameLabel);
frame.add(nameField);
frame.add(emailLabel);
frame.add(emailField);
frame.add(passLabel);
frame.add(passField);
frame.add(submit);
frame.add(result);
frame.setVisible(true);
}
}
markdown复制编辑用户名: [__________]
邮箱: [__________]
密码: [__________]
[注册按钮] 状态:注册成功...
Swing 提供多种方式显示弹窗信息:
java复制编辑JOptionPane.showMessageDialog(null, "操作成功!");
JOptionPane.showConfirmDialog(null, "确认删除?");
JOptionPane.showInputDialog("请输入用户名");
less复制编辑+----------------------------+
| 任务名称 [__________] |
| [添加任务] [删除任务] |
| |
| ✔ 学 Java GUI |
| ☐ 写作业 |
+----------------------------+
java复制编辑DefaultListModel<String> taskListModel = new DefaultListModel<>();
JList<String> taskList = new JList<>(taskListModel);
JButton addBtn = new JButton("添加");
JButton delBtn = new JButton("删除");
addBtn.addActionListener(e -> {
String task = JOptionPane.showInputDialog("请输入任务名称");
if (task != null && !task.trim().isEmpty()) {
taskListModel.addElement("☐ " + task);
}
});
delBtn.addActionListener(e -> {
int index = taskList.getSelectedIndex();
if (index >= 0) {
taskListModel.remove(index);
}
});
问题 | 原因 | 解决方法 |
---|---|---|
窗口不显示 | 未调用 setVisible(true) | 添加 frame.setVisible(true) |
组件叠在一起 | 未设置布局管理器 | 使用合适的布局方式 |
按钮无响应 | 没有添加监听器 | button.addActionListener(...) |
密码框显示明文 | 使用 JTextField 替代了密码框 | 改为 JPasswordField |
Swing 提供了强大的 GUI 编程接口,适合构建跨平台的桌面工具。本文涵盖了:
JTable
实现表格管理系统
LookAndFeel
自定义界面皮肤
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。