news 2026/6/10 17:33:55

Java Swing 图形界面编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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));

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:32:57

别再只看插槽数量了:鲲鹏服务器配置昇腾 A2/Duo,PCIe Lane 才是关键

项目实战经验: 鲲鹏服务器配置昇腾 Atlas 300I A2 / Atlas 300I Duo 时,不能只看“有几个 PCIe 插槽”。真正要先算的是:CPU lane 总数、硬盘占用、网卡占用、RAID/HBA 占用,以及 A2/Duo 实际跑 x16 还是 x8。 一、为什么不能只看 PCIe 插槽数量? 项目里经常会遇到这种情…

作者头像 李华
网站建设 2026/6/10 17:30:10

Vue2项目里手把手集成bpmn-process-designer流程设计器(含版本避坑指南)

Vue2项目实战&#xff1a;深度集成bpmn-process-designer流程设计器全攻略在传统企业级应用开发中&#xff0c;业务流程管理(BPM)系统的构建往往需要专业的流程设计工具支持。对于Vue2技术栈的开发者而言&#xff0c;如何在现有项目中快速集成一个功能完备且可定制的流程设计器…

作者头像 李华
网站建设 2026/6/10 17:24:59

机器学习工程师必须掌握的PDF与CDF实战指南

1. 为什么机器学习工程师必须亲手推一遍PDF和CDF&#xff1f;不是调个库就完事了你有没有遇到过这样的情况&#xff1a;模型在训练集上AUC高达0.95&#xff0c;一到线上就掉到0.72&#xff1b;或者用scikit-learn的predict_proba输出一堆概率值&#xff0c;但业务方盯着直皱眉&…

作者头像 李华
网站建设 2026/6/10 17:24:14

深入解析LPC2939时钟与电源管理:从架构原理到嵌入式实战

1. 项目概述&#xff1a;为什么需要深入理解LPC2939的时钟与电源&#xff1f;在嵌入式系统开发&#xff0c;尤其是汽车电子和工业控制这类对实时性、可靠性和功耗有严苛要求的领域&#xff0c;选对一颗MCU只是第一步&#xff0c;真正让它“听话”且高效地工作&#xff0c;往往取…

作者头像 李华