JAVA+SQL电子通讯录带系统托盘(论文+源代码)

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 系统需求分析

  1. 功能需求

    • 用户管理:支持多用户登录(可选扩展)
    • 联系人管理:增删改查、批量操作
    • 分组管理:自定义分组、分组筛选
    • 数据备份:导入导出 CSV/Excel
    • 系统托盘:最小化到托盘、托盘菜单
  2. 非功能需求

    • 性能:响应时间 < 2秒
    • 可用性:支持 Windows/macOS/Linux
    • 可靠性:数据自动备份
    • 安全性:数据加密存储(可选)

4.3 系统设计

  1. 架构设计:MVC 三层架构
  2. 数据库设计:ER图、表结构设计
  3. 界面设计:原型图、布局设计
  4. 类设计:UML类图、时序图

4.4 实现与测试

  1. 开发环境搭建
  2. 核心模块实现
  3. 单元测试与集成测试
  4. 系统部署与运行

4.5 论文结构建议

  • 第一章:绪论(研究背景、意义、国内外现状)
  • 第二章:相关技术介绍(Java Swing、SQLite、系统托盘)
  • 第三章:系统需求分析
  • 第四章:系统设计
  • 第五章:系统实现
  • 第六章:系统测试
  • 第七章:总结与展望
  • 参考文献
  • 致谢
  • 附录(源代码、使用说明)

5. 项目部署与运行

5.1 环境准备

  1. 安装 JDK 8 或更高版本
  2. 安装 Maven(可选,用于构建)
  3. 安装 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 短期扩展

  1. 数据加密:使用 AES 加密敏感信息
  2. 云端同步:集成 WebDAV 或云存储
  3. 生日提醒:添加生日字段和提醒功能
  4. 导出PDF:支持联系人列表导出为PDF

7.2 长期扩展

  1. 多用户支持:用户注册登录系统
  2. 网络版:基于 Spring Boot 的 Web 版本
  3. 移动端:Android/iOS 客户端
  4. 智能搜索:基于拼音、模糊匹配的搜索

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值