项目预想
字数
1723 字
阅读时间
8 分钟
TIP
名字暂定Qclock,使用 Java 、JavaFX和AI开发,外形是番茄钟形式,搭载上日历和备忘录,可以放置在桌面,再加上一个宠物系统,每完成一个番茄钟加积分换取食物和装饰给宠物。
功能分解
🍅 番茄钟基础
做出能用的番茄钟
src/main/java/com/zhenbao/qclock/
├── QClockApp.java ← 主启动类
├── controller/
│ └── PomodoroController.java ← UI 控制器
└── timer/
└── PomodoroTimer.java ← 计时器引擎
src/main/resources/com/zhenbao/qclock/
└── css/
└── style.css ← 样式表
src/main/java/
└── module-info.java ← 模块配置(已更新)1.搭建项目结构
| 要素 | 说明 |
|---|---|
| 基础计时 | 25分钟倒计时(工作) |
| 休息时间 | 5分钟短休息 / 15分钟长休息(每4个番茄钟) |
| 按钮 | 开始 / 暂停 / 重置 |
| 积分 | 完成番茄钟获得积分 |
| 风格 |
module-info.java — Java 模块声明
js
module com.zhenbao.qclock {
requires javafx.controls; // 需要 JavaFX 控件
requires javafx.fxml; // 需要 JavaFX FXML
requires com.google.gson; // 需要 Gson 库
opens com.zhenbao.qclock to javafx.fxml;
opens com.zhenbao.qclock.controller to javafx.fxml;
exports com.zhenbao.qclock; // 导出主包
exports com.zhenbao.qclock.data; // 导出数据包
}QClockApp.java — 主入口文件
TIP
搭建应用的整体骨架(顶栏 + 内容区 + 底部 Tab 栏)
| 方法 | 作用 |
|---|---|
| start(Stage stage) | 应用启动入口,创建所有控制器并组装界面 |
| createTopBar() | 创建顶部栏(标题 + 积分显示) |
| createTabBar() | 创建底部 4 个 Tab 按钮(🍅📅📝🐱) |
| switchToTab(int index) | 切换 Tab 页面(通过 setVisible 控制显隐) |
| updatePointsDisplay() | 刷新顶部积分显示 |
PomodoroTimer.java — 计时器核心
TIP
大脑中枢,只算时间,不管界面是什么
| 方法 | 作用 |
|---|---|
| Java 枚举 | 构建番茄钟的完整界面 |
| JavaFX Timeline | 倒计时 / 正计时 切换按钮 |
| Runnable 回调 | 显示时间的大圆形区域 |
枚举变量定义格式
- enum 枚举名 {枚举元素1,枚举元素2,……};
java
public enum State {
WORK, // 工作中
SHORT_BREAK, // 短休息
LONG_BREAK // 长休息
}
public enum TimerMode {
COUNTDOWN, // 倒计时(25:00 → 0:00)
STOPWATCH // 正计时(0:00 → 往上加)
}
//也可以用 int 常量(比如 0=工作, 1=短休, 2=长休)| 常量 | 值 | 含义 |
|---|---|---|
| WORK_SECONDS | 25*60 | 工作时长 25 分钟 |
| SHORT_BREAK_SECONDS | 5*60 | 短休 |
| LONG_BREAK_SECONDS | 15*60 | 长休 |
| CYCLE_LENGTH | 4 | 每四个番茄钟一个长休 |
| MIN_WORK_SECONDS | 30 | 最低打卡时间(测试30s) |
java
//定义"时间规则"
private static final int WORK_SECONDS = 25 * 60; // 工作 25 分钟
private static final int SHORT_BREAK_SECONDS = 5 * 60; // 短休息 5 分钟
private static final int LONG_BREAK_SECONDS = 15 * 60; // 长休息 15 分钟
private static final int CYCLE_LENGTH = 4; // 每4个番茄钟长休息
private static final int MIN_WORK_SECONDS = 30; // 最低打卡 30 秒Timeline — 实现"每秒跳一次"
java
public PomodoroTimer() {
// 创建一个每1秒触发一次的定时器
timeline = new Timeline(new KeyFrame(Duration.seconds(1), e -> tick()));
timeline.setCycleCount(Timeline.INDEFINITE); // 无限循环
}java
private void tick() {
if (mode == TimerMode.STOPWATCH) {
// 正计时模式:数字往上加
elapsedSeconds++;
if (state == State.WORK) {
workElapsedSeconds++;
// 检查是否达到最低打卡时间
if (!minWorkReached && workElapsedSeconds >= MIN_WORK_SECONDS) {
minWorkReached = true;
// 可以打卡
if (onMinWorkReached != null) Platform.runLater(onMinWorkReached);
}
}
if (onTick != null) onTick.run(); // 通知 Controller 更新时间显示
} else {
// 倒计时模式:数字往下减
if (remainingSeconds > 0) {
remainingSeconds--;
// ... 同样的打卡检查逻辑 ...
if (remainingSeconds == 0) {
onComplete(); // 时间到了!切换到休息
}
}
}
}回调机制
💡runnable是什么?彻底搞懂Java中的Runnable和Thread-腾讯云开发者社区-腾讯云
TIP
Runnable 做的事情 = () -> { 要执行的代码 };
java
// Timer 里定义了 4 个"回调槽位"
private Runnable onTick; // 每秒更新界面
private Runnable onWorkComplete; // 工作结束 → 通知界面切换到休息
private Runnable onBreakComplete; // 休息结束 → 通知界面回到工作
private Runnable onMinWorkReached; // 达到30秒 → 通知界面解锁打卡按钮java
timer.setOnTick(() -> timerLabel.setText(timer.getFormattedTime()));
// 意思是:每秒把最新时间显示到界面上
timer.setOnWorkComplete(() -> {
dataManager.recordPomodoro(); // 记录一次完成
dataManager.addPoints(10); // 加10积分
modeLabel.setText("☕ 短休息时间!"); // 改界面文字
// ...
});PomodoroController.java — 番茄钟控制器
TIP
番茄钟的界面创建 + 交互逻辑 目前积分规则: 每完成一个番茄钟 → +10 积分
| 方法 | 作用 |
|---|---|
| createview() | 构建番茄钟的完整界面 |
| createModeSwither() | 倒计时 / 正计时 切换按钮 |
| createTimerArea() | 显示时间的大圆形区域 |
| createCompleteButton() | "完成打卡"按钮(10分钟后解锁) |
| handleComplete() | 完成打卡 |
| handleStartPause() | 开始或暂停计时 |
| setupTimerCallbacks() | 设置计时器的回调(完成、休息等事件) |
CalendarController.java — 日历控制器
java.time 日期库
月历视图 + 点击查看日期详情弹窗
| 方法 | 作用 |
|---|---|
| createview() | 构建日历界面 |
| createHeader() | 月份标题 + 前后月导航按钮 |
| createWeekdayRow() | 星期一到星期日标题行 |
| createLegend() | 图例说明(🍅📝✅) |
| createCalendarGrid() | 日历网格 |
| refreshCalendar() | 刷新日历显示 |
| createDayCell() | 创建每一天的单元格+彩色标记 |
| openDayDetail() | 打开日期详情弹窗(显示番茄钟/备忘/习惯) |
MemoController.java — 备忘录控制器
java.time 日期库
待办事项 + 每日习惯打卡 完成一个备忘 → +5 积分 完成一个习惯 → +3 积分
| 方法 | 作用 |
|---|---|
| createview() | 构建备忘录界面 |
| createMemoSection() | 📝 备忘录区块(添加、勾选完成、删除) |
| createHabitSection() | ✅ 习惯打卡区块(添加、每日打卡、删除) |
| handleAddMemo() | 添加新备忘 |
| handleAddHabit() | 添加新习惯 |
| refreshMemos() | 刷新备忘显示 |
| refreshHabits() | 刷新习惯列表 |
| createMemoCell() | 创建单条备忘的 UI |
AppData.java — 数据模型
| 内部类 | 包含字段 |
|---|---|
| 主类AppData | points(积分), totalPomodoroCount(总番茄数), pet(宠物), memos(备忘列表), habits(习惯列表), pomodoroRecords(番茄记录), habitRecords(习惯记录) |
| Memoltem | id, text, completed, createdAt, completedAt, priority |
| HabitItem | id, text, completedToday, lastCompletedDate |
| PetData | name, mood(心情), hunger(饱食), lastInteractionTime, totalPets |
| PomodoroRecord | timestamp, year, month, day |
| HabitRecord | timestamp, habitId, year, month, day |
PomodoroController.java — 界面外观
TIP
布局+界面,主要用javaFX,把 Java 代码和 CSS 样式连接起来,Java 负责定义界面的逻辑和结构,而 CSS 专门负责界面的样式和外观
布局
VBox view (竖着排列,间距15像素)
├── createModeSwitcher() → HBox (横排: [🍅倒计时] [⏱正计时])
├── createTimerArea() → VBox (竖排: 标题文字 + 大圆形时间)
├── createCompleteButton() → Button (🔒10分钟后可打卡)
├── createControlButtons() → HBox (横排: [▶开始] [↺重置])
└── createStatsBar() → HBox (横排: 今日完成:3🍅 ... 每4个长休息)
AOLeomeoww