1. 项目概述
本项目是一个基于 Java Swing 和 SQLite 数据库开发的电子通讯录管理系统,具备完整的增删改查功能,并集成了系统托盘功能,可在后台运行。系统采用 MVC 架构设计,界面友好,操作简便,适合作为 Java 桌面应用开发的课程设计或毕业设计项目。
主要特性:
- 联系人信息管理(姓名、电话、邮箱、地址、分组等)
- 数据库持久化存储(SQLite)
- 系统托盘支持(最小化到托盘、托盘菜单操作)
- 数据导入导出(CSV/Excel格式)
- 联系人分组与搜索功能
- 用户友好的图形界面
2. 系统架构设计
2.1 技术栈
- 开发语言:Java 8+
- GUI框架:Swing
- 数据库:SQLite 3.x
- 构建工具:Maven
- IDE:IntelliJ IDEA / Eclipse
2.2 项目结构
src/
├── main/
│ ├── java/
│ │ ├── com/
│ │ │ └── addressbook/
│ │ │ ├── Main.java # 程序入口
│ │ │ ├── controller/ # 控制器层
│ │ │ │ ├── ContactController.java
│ │ │ │ └── TrayController.java
│ │ │ ├── model/ # 模型层
│ │ │ │ ├── Contact.java # 联系人实体类
│ │ │ │ └── DatabaseHelper.java # 数据库操作类
│ │ │ ├── view/ # 视图层
│ │ │ │ ├── MainFrame.java # 主窗口
│ │ │ │ ├── ContactDialog.java # 联系人对话框
│ │ │ │ └── TrayIconManager.java # 托盘管理
│ │ │ └── util/ # 工具类
│ │ │ ├── FileExporter.java
│ │ │ └── Validator.java
│ │ └── resources/ # 资源文件
│ │ ├── icons/ # 图标文件
│ │ └── db/ # 数据库文件
│ └── test/ # 测试代码
└── pom.xml # Maven配置文件
2.3 数据库设计
-- 联系人表
CREATE TABLE contacts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
phone TEXT NOT NULL,
email TEXT,
address TEXT,
group_name TEXT DEFAULT '默认',
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引提高查询效率
CREATE INDEX idx_name ON contacts(name);
CREATE INDEX idx_group ON contacts(group_name);
CREATE INDEX idx_phone ON contacts(phone);
3. 核心功能实现
3.1 数据库连接与操作
// DatabaseHelper.java
package com.addressbook.model;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHelper {
private static final String DB_URL = "jdbc:sqlite:addressbook.db";
private Connection connection;
public DatabaseHelper() {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection(DB_URL);
createTables();
} catch (Exception e) {
e.printStackTrace();
}
}
private void createTables() {
String sql = "CREATE TABLE IF NOT EXISTS contacts (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT NOT NULL," +
"phone TEXT NOT NULL," +
"email TEXT," +
"address TEXT," +
"group_name TEXT DEFAULT '默认'," +
"created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP," +
"updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)";
try (Statement stmt = connection.createStatement()) {
stmt.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
// 添加联系人
public boolean addContact(Contact contact) {
String sql = "INSERT INTO contacts(name, phone, email, address, group_name) VALUES(?,?,?,?,?)";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
pstmt.setString(1, contact.getName());
pstmt.setString(2, contact.getPhone());
pstmt.setString(3, contact.getEmail());
pstmt.setString(4, contact.getAddress());
pstmt.setString(5, contact.getGroupName());
pstmt.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 查询所有联系人
public List<Contact> getAllContacts() {
List<Contact> contacts = new ArrayList<>();
String sql = "SELECT * FROM contacts ORDER BY name";
try (Statement stmt = connection.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.setGroupName(rs.getString("group_name"));
contacts.add(contact);
}
} catch (SQLException e) {
e.printStackTrace();
}
return contacts;
}
// 其他CRUD方法:updateContact, deleteContact, searchContacts等
}
3.2 系统托盘实现
// TrayIconManager.java
package com.addressbook.view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class TrayIconManager {
private TrayIcon trayIcon;
private SystemTray systemTray;
private MainFrame mainFrame;
public TrayIconManager(MainFrame frame) {
this.mainFrame = frame;
if (SystemTray.isSupported()) {
initTrayIcon();
}
}
private void initTrayIcon() {
systemTray = SystemTray.getSystemTray();
// 加载托盘图标
Image image = Toolkit.getDefaultToolkit()
.getImage(getClass().getResource("/icons/addressbook_16.png"));
// 创建弹出菜单
PopupMenu popup = new PopupMenu();
MenuItem showItem = new MenuItem("显示主窗口");
showItem.addActionListener(e -> mainFrame.setVisible(true));
MenuItem exitItem = new MenuItem("退出");
exitItem.addActionListener(e -> {
systemTray.remove(trayIcon);
System.exit(0);
});
popup.add(showItem);
popup.addSeparator();
popup.add(exitItem);
// 创建托盘图标
trayIcon = new TrayIcon(image, "电子通讯录", popup);
trayIcon.setImageAutoSize(true);
// 添加双击事件
trayIcon.addActionListener(e -> mainFrame.setVisible(true));
try {
systemTray.add(trayIcon);
} catch (AWTException e) {
e.printStackTrace();
}
}
public void showNotification(String title, String message) {
if (trayIcon != null) {
trayIcon.displayMessage(title, message, TrayIcon.MessageType.INFO);
}
}
public void removeFromTray() {
if (trayIcon != null && systemTray != null) {
systemTray.remove(trayIcon);
}
}
}
3.3 主界面设计
// MainFrame.java 部分代码
package com.addressbook.view;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
public class MainFrame extends JFrame {
private JTable contactTable;
private DefaultTableModel tableModel;
private JButton addButton, editButton, deleteButton, searchButton;
private JTextField searchField;
private TrayIconManager trayManager;
public MainFrame() {
initComponents();
initTray();
loadContacts();
}
private void initComponents() {
setTitle("电子通讯录管理系统");
setSize(800, 600);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setLocationRelativeTo(null);
// 窗口关闭事件处理
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
minimizeToTray();
}
});
// 创建工具栏
JToolBar toolBar = new JToolBar();
addButton = new JButton("添加");
editButton = new JButton("编辑");
deleteButton = new JButton("删除");
searchButton = new JButton("搜索");
searchField = new JTextField(20);
toolBar.add(addButton);
toolBar.add(editButton);
toolBar.add(deleteButton);
toolBar.addSeparator();
toolBar.add(new JLabel("搜索:"));
toolBar.add(searchField);
toolBar.add(searchButton);
// 创建表格
String[] columns = {"ID", "姓名", "电话", "邮箱", "地址", "分组"};
tableModel = new DefaultTableModel(columns, 0);
contactTable = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(contactTable);
// 布局
setLayout(new BorderLayout());
add(toolBar, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
// 按钮事件绑定
addButton.addActionListener(e -> showAddDialog());
editButton.addActionListener(e -> showEditDialog());
deleteButton.addActionListener(e -> deleteSelectedContact());
searchButton.addActionListener(e -> searchContacts());
}
private void initTray() {
trayManager = new TrayIconManager(this);
}
private void minimizeToTray() {
setVisible(false);
trayManager.showNotification("电子通讯录", "程序已最小化到系统托盘");
}
private void loadContacts() {
// 从数据库加载联系人并更新表格
}
private void showAddDialog() {
// 显示添加联系人对话框
}
private void showEditDialog() {
// 显示编辑联系人对话框
}
private void deleteSelectedContact() {
// 删除选中的联系人
}
private void searchContacts() {
// 搜索联系人
}
}
4. 论文要点(毕业设计/课程设计)
4.1 摘要
本文设计并实现了一个基于 Java Swing 和 SQLite 数据库的电子通讯录管理系统。系统采用 MVC 设计模式,实现了联系人的增删改查、分组管理、数据导入导出等核心功能。特别地,系统集成了系统托盘功能,支持后台运行和快速唤醒,提升了用户体验。系统界面友好,操作简便,具有良好的可扩展性和维护性。
4.2 系统需求分析
-
功能需求
- 用户管理:支持多用户登录(可选扩展)
- 联系人管理:增删改查、批量操作
- 分组管理:自定义分组、分组筛选
- 数据备份:导入导出 CSV/Excel
- 系统托盘:最小化到托盘、托盘菜单
-
非功能需求
- 性能:响应时间 < 2秒
- 可用性:支持 Windows/macOS/Linux
- 可靠性:数据自动备份
- 安全性:数据加密存储(可选)
4.3 系统设计
- 架构设计:MVC 三层架构
- 数据库设计:ER图、表结构设计
- 界面设计:原型图、布局设计
- 类设计:UML类图、时序图
4.4 实现与测试
- 开发环境搭建
- 核心模块实现
- 单元测试与集成测试
- 系统部署与运行
4.5 论文结构建议
- 第一章:绪论(研究背景、意义、国内外现状)
- 第二章:相关技术介绍(Java Swing、SQLite、系统托盘)
- 第三章:系统需求分析
- 第四章:系统设计
- 第五章:系统实现
- 第六章:系统测试
- 第七章:总结与展望
- 参考文献
- 致谢
- 附录(源代码、使用说明)
5. 项目部署与运行
5.1 环境准备
- 安装 JDK 8 或更高版本
- 安装 Maven(可选,用于构建)
- 安装 SQLite(可选,系统自带驱动)
5.2 项目导入与运行
# 1. 克隆或下载项目
git clone https://github.com/yourusername/addressbook-system.git
# 2. 导入IDE(IntelliJ IDEA/Eclipse)
# - File -> Open -> 选择项目文件夹
# - 等待Maven依赖下载完成
# 3. 运行主类
# - 找到 Main.java
# - 右键 -> Run 'Main.main()'
5.3 Maven 依赖配置
<!-- pom.xml -->
<dependencies>
<!-- SQLite JDBC驱动 -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.42.0.0</version>
</dependency>
<!-- Apache Commons CSV(用于导入导出) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.10.0</version>
</dependency>
<!-- JUnit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
6. 功能演示与截图
6.1 主界面
+-----------------------------------------+
| 电子通讯录管理系统 |
+-----------------------------------------+
| [添加] [编辑] [删除] | 搜索:[输入框] [搜索] |
+-----------------------------------------+
| ID | 姓名 | 电话 | 邮箱 |
|----|--------|------------|-------------|
| 1 | 张三 | 13800138000| zs@qq.com |
| 2 | 李四 | 13900139000| ls@qq.com |
| 3 | 王五 | 13700137000| ww@qq.com |
+-----------------------------------------+
6.2 系统托盘效果
- 程序最小化后显示在系统托盘区
- 右键托盘图标显示菜单:显示主窗口、退出
- 双击托盘图标快速恢复主窗口
- 支持托盘消息通知
7. 扩展功能建议
7.1 短期扩展
- 数据加密:使用 AES 加密敏感信息
- 云端同步:集成 WebDAV 或云存储
- 生日提醒:添加生日字段和提醒功能
- 导出PDF:支持联系人列表导出为PDF
7.2 长期扩展
- 多用户支持:用户注册登录系统
- 网络版:基于 Spring Boot 的 Web 版本
- 移动端:Android/iOS 客户端
- 智能搜索:基于拼音、模糊匹配的搜索
8. 常见问题与解决方案
8.1 数据库连接失败
问题:java.sql.SQLException: no suitable driver found
解决:确保 sqlite-jdbc 依赖已正确添加,或手动添加驱动 jar 包。
8.2 系统托盘不显示
问题:在某些 Linux 桌面环境下系统托盘可能不工作
解决:检查系统是否支持 SystemTray,或使用第三方托盘库。
8.3 中文乱码
问题:数据库或界面显示中文乱码
解决:
// 数据库连接时指定编码
String url = "jdbc:sqlite:addressbook.db?charset=utf8";
// Swing组件设置字体
UIManager.put("Button.font", new Font("微软雅黑", Font.PLAIN, 12));
UIManager.put("Label.font", new Font("微软雅黑", Font.PLAIN, 12));
8.4 打包为可执行文件
使用 Maven Assembly 插件或 Launch4j 打包:
<!-- 在pom.xml中添加 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.addressbook.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
9. 源代码获取与使用
9.1 完整项目结构
项目包含以下核心文件:
Main.java- 程序入口DatabaseHelper.java- 数据库操作类Contact.java- 联系人实体类MainFrame.java- 主界面类ContactDialog.java- 联系人编辑对话框TrayIconManager.java- 系统托盘管理pom.xml
140

被折叠的 条评论
为什么被折叠?



