基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVA+SQL电子通讯录带系统托盘
一、系统概述
本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统托盘,实现后台运行。
二、系统架构设计
1. 技术选型
- 前端:Java Swing
- 后端:Java SE
- 数据库:SQLite 3.36+
- 数据访问:JDBC
- 开发工具:Eclipse
2. 系统架构
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── addressbook
│ │ │ ├── controller (控制器层)
│ │ │ ├── model (模型层)
│ │ │ ├── view (视图层)
│ │ │ ├── dao (数据访问层)
│ │ │ └── utils (工具类)
三、核心代码实现
1. 数据库连接工具类
// DBConnectionUtil.java
public class DBConnectionUtil {private static final String DB_URL = "jdbc:sqlite:addressbook.db";public static Connection getConnection() throws SQLException {return DriverManager.getConnection(DB_URL);}public static void close(Connection conn, Statement stmt, ResultSet rs) {try {if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}// 初始化数据库public static void initDatabase() {try (Connection conn = getConnection();Statement stmt = conn.createStatement()) {// 创建联系人表String createTableSQL = "CREATE TABLE IF NOT EXISTS contacts (" +"id INTEGER PRIMARY KEY AUTOINCREMENT," +"name TEXT NOT NULL," +"phone TEXT," +"email TEXT," +"address TEXT," +"groupId INTEGER," +"photo BLOB," +"FOREIGN KEY (groupId) REFERENCES groups(id)" +")";stmt.execute(createTableSQL);// 创建分组表createTableSQL = "CREATE TABLE IF NOT EXISTS groups (" +"id INTEGER PRIMARY KEY AUTOINCREMENT," +"name TEXT NOT NULL UNIQUE" +")";stmt.execute(createTableSQL);// 插入默认分组String checkDefaultGroupSQL = "SELECT COUNT(*) FROM groups WHERE name = '默认分组'";ResultSet rs = stmt.executeQuery(checkDefaultGroupSQL);if (rs.next() && rs.getInt(1) == 0) {String insertDefaultGroupSQL = "INSERT INTO groups (name) VALUES ('默认分组')";stmt.execute(insertDefaultGroupSQL);}} catch (SQLException e) {e.printStackTrace();}}
}
2. 联系人实体类
// Contact.java
public class Contact {private int id;private String name;private String phone;private String email;private String address;private int groupId;private byte[] photo;// getters and setters
}
3. 联系人数据访问类
// ContactDAO.java
public class ContactDAO {public List<Contact> getAllContacts() {List<Contact> contacts = new ArrayList<>();String sql = "SELECT * FROM contacts ORDER BY name";try (Connection conn = DBConnectionUtil.getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {Contact contact = new Contact();contact.setId(rs.getInt("id"));contact.setName(rs.getString("name"));contact.setPhone(rs.getString("phone"));contact.setEmail(rs.getString("email"));contact.setAddress(rs.getString("address"));contact.setGroupId(rs.getInt("groupId"));contact.setPhoto(rs.getBytes("photo"));contacts.add(contact);}} catch (SQLException e) {e.printStackTrace();}return contacts;}public boolean addContact(Contact contact) {String sql = "INSERT INTO contacts (name, phone, email, address, groupId, photo) " +"VALUES (?, ?, ?, ?, ?, ?)";try (Connection conn = DBConnectionUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, contact.getName());pstmt.setString(2, contact.getPhone());pstmt.setString(3, contact.getEmail());pstmt.setString(4, contact.getAddress());pstmt.setInt(5, contact.getGroupId());pstmt.setBytes(6, contact.getPhoto());int rows = pstmt.executeUpdate();return rows > 0;} catch (SQLException e) {e.printStackTrace();return false;}}public boolean updateContact(Contact contact) {String sql = "UPDATE contacts SET name = ?, phone = ?, email = ?, " +"address = ?, groupId = ?, photo = ? WHERE id = ?";try (Connection conn = DBConnectionUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, contact.getName());pstmt.setString(2, contact.getPhone());pstmt.setString(3, contact.getEmail());pstmt.setString(4, contact.getAddress());pstmt.setInt(5, contact.getGroupId());pstmt.setBytes(6, contact.getPhoto());pstmt.setInt(7, contact.getId());int rows = pstmt.executeUpdate();return rows > 0;} catch (SQLException e) {e.printStackTrace();return false;}}public boolean deleteContact(int id) {String sql = "DELETE FROM contacts WHERE id = ?";try (Connection conn = DBConnectionUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, id);int rows = pstmt.executeUpdate();return rows > 0;} catch (SQLException e) {e.printStackTrace();return false;}}
}
4. 系统托盘实现
// TrayManager.java
public class TrayManager {private static final String ICON_PATH = "resources/addressbook.png";private SystemTray tray;private TrayIcon trayIcon;private JFrame mainFrame;public TrayManager(JFrame mainFrame) {this.mainFrame = mainFrame;initTray();}private void initTray() {if (!SystemTray.isSupported()) {System.out.println("系统不支持托盘功能");return;}tray = SystemTray.getSystemTray();Image image = Toolkit.getDefaultToolkit().getImage(ICON_PATH);// 创建弹出菜单PopupMenu popupMenu = new PopupMenu();MenuItem openItem = new MenuItem("打开");openItem.addActionListener(e -> showFrame());MenuItem exitItem = new MenuItem("退出");exitItem.addActionListener(e -> {if (JOptionPane.showConfirmDialog(mainFrame, "确定要退出程序吗?", "确认退出", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {System.exit(0);}});popupMenu.add(openItem);popupMenu.addSeparator();popupMenu.add(exitItem);// 创建托盘图标trayIcon = new TrayIcon(image, "电子通讯录", popupMenu);trayIcon.setImageAutoSize(true);// 添加双击事件trayIcon.addActionListener(e -> showFrame());try {tray.add(trayIcon);} catch (AWTException e) {e.printStackTrace();}}public void hideFrame() {mainFrame.setVisible(false);trayIcon.displayMessage("电子通讯录", "程序已最小化到托盘", TrayIcon.MessageType.INFO);}public void showFrame() {mainFrame.setVisible(true);mainFrame.setExtendedState(JFrame.NORMAL);mainFrame.toFront();}public void showMessage(String message) {trayIcon.displayMessage("电子通讯录", message, TrayIcon.MessageType.INFO);}public void removeTrayIcon() {tray.remove(trayIcon);}
}
5. 主界面
// MainFrame.java
public class MainFrame extends JFrame {private JTable contactTable;private ContactTableModel tableModel;private ContactDAO contactDAO = new ContactDAO();private TrayManager trayManager;public MainFrame() {setTitle("电子通讯录");setSize(800, 600);setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);setLocationRelativeTo(null);// 初始化系统托盘trayManager = new TrayManager(this);// 添加窗口关闭事件addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {trayManager.hideFrame();}});initComponents();loadContacts();}private void initComponents() {// 工具栏JToolBar toolBar = new JToolBar();JButton addButton = new JButton("添加");JButton editButton = new JButton("编辑");JButton deleteButton = new JButton("删除");JButton refreshButton = new JButton("刷新");addButton.addActionListener(e -> openAddContactDialog());editButton.addActionListener(e -> openEditContactDialog());deleteButton.addActionListener(e -> deleteSelectedContact());refreshButton.addActionListener(e -> loadContacts());toolBar.add(addButton);toolBar.add(editButton);toolBar.add(deleteButton);toolBar.addSeparator();toolBar.add(refreshButton);// 表格tableModel = new ContactTableModel();contactTable = new JTable(tableModel);JScrollPane scrollPane = new JScrollPane(contactTable);// 布局setLayout(new BorderLayout());add(toolBar, BorderLayout.NORTH);add(scrollPane, BorderLayout.CENTER);}private void loadContacts() {List<Contact> contacts = contactDAO.getAllContacts();tableModel.setContacts(contacts);}// 其他方法省略...
}
四、系统界面设计
1. 联系人表格模型
// ContactTableModel.java
public class ContactTableModel extends AbstractTableModel {private List<Contact> contacts = new ArrayList<>();private String[] columnNames = {"ID", "姓名", "电话", "邮箱", "地址", "分组"};@Overridepublic int getRowCount() {return contacts.size();}@Overridepublic int getColumnCount() {return columnNames.length;}@Overridepublic Object getValueAt(int rowIndex, int columnIndex) {Contact contact = contacts.get(rowIndex);switch (columnIndex) {case 0: return contact.getId();case 1: return contact.getName();case 2: return contact.getPhone();case 3: return contact.getEmail();case 4: return contact.getAddress();case 5: return getGroupName(contact.getGroupId());default: return null;}}@Overridepublic String getColumnName(int column) {return columnNames[column];}// 其他方法省略...
}
五、系统部署与测试
1. 环境要求
- JDK 1.8+
- SQLite JDBC驱动:sqlite-jdbc-3.36.0.3.jar
2. 部署步骤
- 确保JDK和SQLite JDBC驱动已安装
- 编译项目生成可执行JAR文件
- 创建必要的资源文件夹和图标文件
- 运行程序:java -jar addressbook.jar
3. 测试用例
// ContactDAOTest.java
public class ContactDAOTest {private ContactDAO contactDAO = new ContactDAO();@Beforepublic void setUp() {DBConnectionUtil.initDatabase();}@Testpublic void testAddContact() {Contact contact = new Contact();contact.setName("张三");contact.setPhone("13800138000");contact.setEmail("zhangsan@example.com");contact.setAddress("北京市朝阳区");contact.setGroupId(1);boolean result = contactDAO.addContact(contact);assertTrue(result);}@Testpublic void testUpdateContact() {// 先添加一个联系人Contact contact = new Contact();contact.setName("李四");contact.setPhone("13900139000");contact.setEmail("lisi@example.com");contact.setAddress("上海市浦东新区");contact.setGroupId(1);contactDAO.addContact(contact);// 获取联系人并更新List<Contact> contacts = contactDAO.getAllContacts();Contact toUpdate = contacts.get(0);toUpdate.setPhone("13912345678");boolean result = contactDAO.updateContact(toUpdate);assertTrue(result);}@Testpublic void testDeleteContact() {// 先添加一个联系人Contact contact = new Contact();contact.setName("测试删除");contact.setPhone("12345678901");contact.setEmail("test@example.com");contact.setAddress("测试地址");contact.setGroupId(1);contactDAO.addContact(contact);// 获取联系人ID并删除List<Contact> contacts = contactDAO.getAllContacts();int id = contacts.get(0).getId();boolean result = contactDAO.deleteContact(id);assertTrue(result);}
}
六、毕业设计文档框架
1. 论文框架
- 引言
- 相关技术综述
- 系统需求分析
- 系统设计
- 系统实现
- 系统测试
- 总结与展望
七、总结
本电子通讯录系统实现了基本的联系人管理功能,并创新性地加入了系统托盘功能,提升了用户体验。系统采用Java+SQLite技术栈,具有良好的可移植性和扩展性,可作为个人或小型团队的通讯录管理工具使用。
相关文章:
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...