Skip to content

项目预想

字数
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_SECONDS25*60工作时长 25 分钟
SHORT_BREAK_SECONDS5*60短休
LONG_BREAK_SECONDS15*60长休
CYCLE_LENGTH4每四个番茄钟一个长休
MIN_WORK_SECONDS30最低打卡时间(测试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 — 数据模型
内部类包含字段
主类AppDatapoints(积分), totalPomodoroCount(总番茄数), pet(宠物), memos(备忘列表), habits(习惯列表), pomodoroRecords(番茄记录), habitRecords(习惯记录)
Memoltemid, text, completed, createdAt, completedAt, priority
HabitItemid, text, completedToday, lastCompletedDate
PetDataname, mood(心情), hunger(饱食), lastInteractionTime, totalPets
PomodoroRecordtimestamp, year, month, day
HabitRecordtimestamp, 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个长休息)

贡献者

撰写