开发个人日程安排工具是Java实践项目中非常经典的选择,能够覆盖面向对象编程、图形界面开发、数据存储等多个核心知识点,适合有一定Java基础的学习者用来提升项目开发能力。

项目需求与前期准备
首先要明确工具的核心功能,避免开发过程中功能蔓延。个人日程安排工具的基础功能包括日程增删改查、日程分类、提醒设置、数据持久化存储。技术选型上,图形界面可以使用Java自带的Swing框架,不需要额外引入第三方依赖,数据存储可以使用SQLite轻量数据库,方便本地部署和使用。
环境准备
- JDK版本选择JDK8及以上,兼容性好且功能完善
- 开发工具可以使用IntelliJ IDEA或者Eclipse,根据个人使用习惯选择即可
- 需要引入SQLite的JDBC驱动包,用于数据库操作
数据库设计
日程数据需要持久化存储,首先要设计合理的数据库表结构。核心的日程表需要包含日程ID、日程标题、日程内容、开始时间、结束时间、日程分类、是否提醒、提醒时间等字段。
创建日程表的SQL语句如下:
-- 创建日程表
CREATE TABLE IF NOT EXISTS schedule (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title VARCHAR(100) NOT NULL,
content TEXT,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
category VARCHAR(50) DEFAULT '默认分类',
is_remind INTEGER DEFAULT 0,
remind_time TIMESTAMP
);
核心功能实现
日程实体类定义
首先定义日程对应的实体类,封装日程相关属性,方便后续数据传递和操作。
import java.sql.Timestamp;
public class Schedule {
private Integer id;
private String title;
private String content;
private Timestamp startTime;
private Timestamp endTime;
private String category;
private Integer isRemind; // 0表示不提醒,1表示提醒
private Timestamp remindTime;
// 构造方法
public Schedule() {}
public Schedule(String title, String content, Timestamp startTime, Timestamp endTime, String category, Integer isRemind, Timestamp remindTime) {
this.title = title;
this.content = content;
this.startTime = startTime;
this.endTime = endTime;
this.category = category;
this.isRemind = isRemind;
this.remindTime = remindTime;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Timestamp getStartTime() {
return startTime;
}
public void setStartTime(Timestamp startTime) {
this.startTime = startTime;
}
public Timestamp getEndTime() {
return endTime;
}
public void setEndTime(Timestamp endTime) {
this.endTime = endTime;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Integer getIsRemind() {
return isRemind;
}
public void setIsRemind(Integer isRemind) {
this.isRemind = isRemind;
}
public Timestamp getRemindTime() {
return remindTime;
}
public void setRemindTime(Timestamp remindTime) {
this.remindTime = remindTime;
}
}
数据库操作工具类
封装数据库连接的获取和关闭方法,以及基础的增删改查操作,减少重复代码。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
public class DBUtil {
// 数据库连接地址,使用本地SQLite数据库
private static final String URL = "jdbc:sqlite:schedule.db";
static {
try {
// 加载SQLite驱动
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL);
}
// 添加日程
public static boolean addSchedule(Schedule schedule) {
String sql = "INSERT INTO schedule (title, content, start_time, end_time, category, is_remind, remind_time) VALUES (?, ?, ?, ?, ?, ?, ?)";
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, schedule.getTitle());
ps.setString(2, schedule.getContent());
ps.setTimestamp(3, schedule.getStartTime());
ps.setTimestamp(4, schedule.getEndTime());
ps.setString(5, schedule.getCategory());
ps.setInt(6, schedule.getIsRemind());
ps.setTimestamp(7, schedule.getRemindTime());
return ps.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 查询所有日程
public static List<Schedule> getAllSchedules() {
List<Schedule> list = new ArrayList<>();
String sql = "SELECT * FROM schedule ORDER BY start_time ASC";
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Schedule schedule = new Schedule();
schedule.setId(rs.getInt("id"));
schedule.setTitle(rs.getString("title"));
schedule.setContent(rs.getString("content"));
schedule.setStartTime(rs.getTimestamp("start_time"));
schedule.setEndTime(rs.getTimestamp("end_time"));
schedule.setCategory(rs.getString("category"));
schedule.setIsRemind(rs.getInt("is_remind"));
schedule.setRemindTime(rs.getTimestamp("remind_time"));
list.add(schedule);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
// 根据ID删除日程
public static boolean deleteScheduleById(Integer id) {
String sql = "DELETE FROM schedule WHERE id = ?";
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, id);
return ps.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
图形界面开发
使用Swing开发主界面,包含日程列表展示区域、添加日程按钮、删除日程按钮等组件。以下是主界面初始化部分的代码示例:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.List;
public class ScheduleFrame extends JFrame {
private JTable scheduleTable;
private DefaultTableModel tableModel;
public ScheduleFrame() {
initFrame();
initComponents();
loadScheduleData();
}
// 初始化窗口属性
private void initFrame() {
setTitle("个人日程安排工具");
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
}
// 初始化界面组件
private void initComponents() {
// 顶部按钮面板
JPanel btnPanel = new JPanel();
JButton addBtn = new JButton("添加日程");
JButton deleteBtn = new JButton("删除日程");
btnPanel.add(addBtn);
btnPanel.add(deleteBtn);
add(btnPanel, BorderLayout.NORTH);
// 日程表格
String[] columnNames = {"ID", "标题", "开始时间", "结束时间", "分类"};
tableModel = new DefaultTableModel(columnNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
// 表格内容不可编辑
return false;
}
};
scheduleTable = new JTable(tableModel);
JScrollPane scrollPane = new JScrollPane(scheduleTable);
add(scrollPane, BorderLayout.CENTER);
// 按钮点击事件
addBtn.addActionListener(e -> new AddScheduleDialog(this).setVisible(true));
deleteBtn.addActionListener(e -> {
int selectedRow = scheduleTable.getSelectedRow();
if (selectedRow == -1) {
JOptionPane.showMessageDialog(this, "请选择要删除的日程");
return;
}
int id = (int) tableModel.getValueAt(selectedRow, 0);
if (DBUtil.deleteScheduleById(id)) {
JOptionPane.showMessageDialog(this, "删除成功");
loadScheduleData();
} else {
JOptionPane.showMessageDialog(this, "删除失败");
}
});
}
// 加载日程数据到表格
public void loadScheduleData() {
tableModel.setRowCount(0);
List<Schedule> schedules = DBUtil.getAllSchedules();
for (Schedule schedule : schedules) {
Object[] row = {
schedule.getId(),
schedule.getTitle(),
schedule.getStartTime(),
schedule.getEndTime(),
schedule.getCategory()
};
tableModel.addRow(row);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ScheduleFrame().setVisible(true));
}
}
功能扩展建议
完成基础功能后,可以根据需求扩展更多实用功能:
- 添加日程搜索功能,支持按标题、分类、时间范围搜索日程
- 实现提醒功能,使用Timer定时检查需要提醒的日程,弹出提醒窗口
- 支持日程导出为文本或者Excel文件,方便用户备份和分享
- 优化界面样式,使用更美观的Swing外观主题,提升使用体验
开发注意事项
开发过程中需要注意几个关键点:
- SQLite数据库文件路径要正确,避免连接失败
- 时间格式处理要统一,建议使用Timestamp类型存储时间,避免时区问题
- Swing组件的操作要在事件调度线程中执行,避免界面卡顿
- 数据库操作要做好异常处理,避免程序意外崩溃