java windows版本待办事项提醒器工具,jdk8
以下是一个完整的 Java 程序,可以添加待办事项和时间,并在指定时间强制弹窗占满整个屏幕提醒:
演示效果
package com.ai;
import javax.swing.*;
import java.awt.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class FullScreenReminder {
private static final List<Reminder> reminders = new ArrayList<>();
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
// 创建主窗口
JFrame mainFrame = new JFrame("待办事项提醒器");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(500, 400);
mainFrame.setLocationRelativeTo(null);
// 主面板
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// 输入面板
JPanel inputPanel = new JPanel(new GridLayout(3, 2, 5, 5));
JLabel dateLabel = new JLabel("日期时间 (yyyy-MM-dd HH:mm:ss):");
JTextField dateField = new JTextField();
JLabel taskLabel = new JLabel("待办事项:");
JTextField taskField = new JTextField();
JButton addButton = new JButton("添加提醒");
inputPanel.add(dateLabel);
inputPanel.add(dateField);
inputPanel.add(taskLabel);
inputPanel.add(taskField);
inputPanel.add(new JLabel());
inputPanel.add(addButton);
// 提醒列表
DefaultListModel<String> listModel = new DefaultListModel<>();
JList<String> reminderList = new JList<>(listModel);
JScrollPane scrollPane = new JScrollPane(reminderList);
// 添加按钮事件
addButton.addActionListener(e -> {
try {
String dateTimeStr = dateField.getText().trim();
String task = taskField.getText().trim();
if (dateTimeStr.isEmpty() || task.isEmpty()) {
JOptionPane.showMessageDialog(mainFrame, "日期时间和待办事项不能为空", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
LocalDateTime reminderTime = LocalDateTime.parse(dateTimeStr, formatter);
LocalDateTime now = LocalDateTime.now();
if (reminderTime.isBefore(now)) {
JOptionPane.showMessageDialog(mainFrame, "提醒时间不能早于当前时间", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
Reminder reminder = new Reminder(reminderTime, task);
reminders.add(reminder);
listModel.addElement(reminder.toString());
// 设置定时任务
scheduleReminder(reminder);
dateField.setText("");
taskField.setText("");
} catch (Exception ex) {
JOptionPane.showMessageDialog(mainFrame, "日期时间格式不正确,请使用 yyyy-MM-dd HH:mm:ss 格式", "错误", JOptionPane.ERROR_MESSAGE);
}
});
mainPanel.add(inputPanel, BorderLayout.NORTH);
mainPanel.add(scrollPane, BorderLayout.CENTER);
mainFrame.add(mainPanel);
mainFrame.setVisible(true);
}
private static void scheduleReminder(Reminder reminder) {
Timer timer = new Timer();
long delay = java.time.Duration.between(LocalDateTime.now(), reminder.getTime()).toMillis();
timer.schedule(new TimerTask() {
@Override
public void run() {
showFullScreenReminder(reminder.getTask());
}
}, delay);
}
private static void showFullScreenReminder(String task) {
// 创建全屏提醒窗口
JFrame reminderFrame = new JFrame();
reminderFrame.setUndecorated(true); // 无边框
reminderFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); // 最大化
reminderFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 设置窗口始终在最前
reminderFrame.setAlwaysOnTop(true);
// 创建内容面板
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(new Color(255, 100, 100)); // 醒目的红色背景
panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
// 提醒文本
JLabel reminderLabel = new JLabel("<html><div style='text-align: center;'>" +
"<h1>待办事项提醒!</h1>" +
"<p style='font-size: 24px;'>" + task + "</p>" +
"</div></html>", SwingConstants.CENTER);
reminderLabel.setFont(new Font("微软雅黑", Font.BOLD, 36));
// 确认按钮
JButton confirmButton = new JButton("我知道了");
confirmButton.setFont(new Font("微软雅黑", Font.PLAIN, 24));
confirmButton.addActionListener(e -> reminderFrame.dispose());
panel.add(reminderLabel, BorderLayout.CENTER);
panel.add(confirmButton, BorderLayout.SOUTH);
reminderFrame.add(panel);
reminderFrame.setVisible(true);
// 强制获取焦点
reminderFrame.toFront();
reminderFrame.requestFocus();
// 播放提示音
Toolkit.getDefaultToolkit().beep();
}
static class Reminder {
private final LocalDateTime time;
private final String task;
public Reminder(LocalDateTime time, String task) {
this.time = time;
this.task = task;
}
public LocalDateTime getTime() {
return time;
}
public String getTask() {
return task;
}
@Override
public String toString() {
return time.format(formatter) + " - " + task;
}
}
}
程序功能说明
添加待办事项:
输入日期时间(格式:yyyy-MM-dd HH:mm:ss)
输入待办事项内容
点击"添加提醒"按钮
强制提醒功能:
到达指定时间后,会全屏弹窗提醒
弹窗会占据整个屏幕,无法忽略
弹窗背景为醒目的红色
同时会播放系统提示音
必须点击"我知道了"按钮才能关闭弹窗
技术实现:
使用 Java Swing 创建 GUI 界面
使用 Timer 实现定时任务
使用 JFrame.MAXIMIZED_BOTH 实现全屏显示
使用 setAlwaysOnTop(true) 确保窗口在最前
使用 Toolkit.getDefaultToolkit().beep() 播放提示音
使用方法
将代码保存为 FullScreenReminder.java
编译运行:javac FullScreenReminder.java && java FullScreenReminder
按照格式输入日期时间和待办事项
程序会在后台运行,到时间自动弹出全屏提醒
扩展建议
持久化存储:可以将待办事项保存到文件或数据库,程序启动时自动加载
多提醒方式:可以增加声音提醒、闪烁效果等
提前提醒:可以设置提前几分钟提醒
重复提醒:可以设置周期性重复提醒
需要任何功能扩展或调整,可以告诉我具体需求
Java 待办事项提醒器 代码逐行详细解读
这是一个基于 Swing 图形界面 + Java 定时任务实现的全屏待办提醒工具,功能:添加提醒时间/事项、定时全屏弹窗提醒。
我会分模块、逐段、逐行讲清楚,零基础也能看懂。
一、整体结构总览
整个代码分为 4 部分:
- 包与导入:引入需要的图形、时间、集合、定时工具
- 全局变量:存储提醒列表、时间格式化工具
- main 方法:程序入口 + 绘制主界面
- 工具方法:定时任务调度、全屏弹窗
- 内部类:封装提醒数据(时间+任务)
二、逐段详细解读
1. 包声明 + 依赖导入
package com.ai; // 代码所在包名
import javax.swing.*; // Swing 图形界面所有组件(窗口、按钮、文本框)
import java.awt.*; // 界面样式、颜色、字体、布局
import java.time.LocalDateTime; // Java8 新时间类(替代 Date)
import java.time.format.DateTimeFormatter; // 时间格式化
import java.util.ArrayList;
import java.util.List; // 存储多个提醒
import java.util.Timer; // 定时器
import java.util.TimerTask; // 定时要执行的任务
作用:告诉程序需要用到哪些系统工具,没有这些代码无法运行。
2. 全局静态变量
// 存储所有提醒的集合(增删查改方便)
private static final List<Reminder> reminders = new ArrayList<>();
// 时间格式化工具:严格按照 yyyy-MM-dd HH:mm:ss 解析/显示时间
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
static:整个程序共用这一份数据final:集合对象本身不可替换(但可以往里添加元素)- 作用:所有添加的提醒都存在这里
3. main 方法(程序入口 + 主界面)
main 是程序运行的起点,负责画窗口、放组件、处理用户操作。
3.1 创建主窗口
JFrame mainFrame = new JFrame("待办事项提醒器");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口=退出程序
mainFrame.setSize(500, 400); // 窗口宽高
mainFrame.setLocationRelativeTo(null); // 窗口居中显示
3.2 主面板 + 布局
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 内边距
BorderLayout:把界面分成 上北/中/下南/左西/右东- 给窗口加留白,更美观
3.3 输入区域(时间+任务+按钮)
JPanel inputPanel = new JPanel(new GridLayout(3, 2, 5, 5));
// 3行2列,组件间距5px
JLabel dateLabel = new JLabel("日期时间...");
JTextField dateField = new JTextField(); // 输入时间的文本框
JLabel taskLabel = new JLabel("待办事项:");
JTextField taskField = new JTextField(); // 输入任务
JButton addButton = new JButton("添加提醒");
GridLayout(3,2):自动整齐排列 6 个组件- 两个输入框:用户填时间和提醒内容
- 按钮:点击添加提醒
3.4 提醒列表展示
DefaultListModel<String> listModel = new DefaultListModel<>(); // 列表数据模型
JList<String> reminderList = new JList<>(listModel); // 展示列表
JScrollPane scrollPane = new JScrollPane(reminderList); // 滚动条
- 作用:把添加成功的提醒显示在界面上,方便查看
3.5 添加按钮点击事件(核心逻辑)
addButton.addActionListener(e -> {
try {
// 1. 获取用户输入并去空格
String dateTimeStr = dateField.getText().trim();
String task = taskField.getText().trim();
// 2. 非空校验
if (dateTimeStr.isEmpty() || task.isEmpty()) {
JOptionPane.showMessageDialog(... 不能为空...);
return;
}
// 3. 把字符串解析成时间
LocalDateTime reminderTime = LocalDateTime.parse(dateTimeStr, formatter);
LocalDateTime now = LocalDateTime.now(); // 当前时间
// 4. 不能添加过去的时间
if (reminderTime.isBefore(now)) {
JOptionPane.showMessageDialog(... 不能早于当前时间...);
return;
}
// 5. 封装成 Reminder 对象,存入集合 + 显示到列表
Reminder reminder = new Reminder(reminderTime, task);
reminders.add(reminder);
listModel.addElement(reminder.toString());
// 6. 核心:启动定时任务
scheduleReminder(reminder);
// 7. 清空输入框
dateField.setText("");
taskField.setText("");
} catch (Exception ex) {
// 时间格式输错时捕获异常
JOptionPane.showMessageDialog(... 格式不正确...);
}
});
✅ 这段是整个程序的大脑:
- 校验输入合法性
- 封装提醒数据
- 启动定时提醒
- 刷新界面列表
3.6 组装界面并显示
mainPanel.add(inputPanel, BorderLayout.NORTH); // 输入框放顶部
mainPanel.add(scrollPane, BorderLayout.CENTER); // 列表放中间
mainFrame.add(mainPanel);
mainFrame.setVisible(true); // 显示窗口
4. 定时任务调度方法
private static void scheduleReminder(Reminder reminder) {
Timer timer = new Timer(); // 创建定时器
// 计算 当前时间 → 提醒时间 的毫秒差
long delay = java.time.Duration.between(LocalDateTime.now(), reminder.getTime()).toMillis();
// 延迟 delay 毫秒后执行任务
timer.schedule(new TimerTask() {
@Override
public void run() {
showFullScreenReminder(reminder.getTask()); // 弹出全屏提醒
}
}, delay);
}
Timer:Java 自带定时工具delay:倒计时多久后弹窗- 时间一到,自动调用
showFullScreenReminder
5. 全屏提醒弹窗(核心视觉效果)
private static void showFullScreenReminder(String task) {
// 1. 创建无边框、全屏、置顶窗口
JFrame reminderFrame = new JFrame();
reminderFrame.setUndecorated(true); // 无边框
reminderFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); // 全屏
reminderFrame.setAlwaysOnTop(true); // 永远在最前面(强制提醒)
reminderFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 2. 红色醒目面板
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(new Color(255, 100, 100)); // 亮红
panel.setBorder(...留白...);
// 3. 提醒文字(支持HTML样式)
JLabel reminderLabel = new JLabel("<html><div style='text-align: center;'>" +
"<h1>待办事项提醒!</h1>" +
"<p style='font-size: 24px;'>" + task + "</p>" +
"</div></html>", SwingConstants.CENTER);
reminderLabel.setFont(new Font("微软雅黑", Font.BOLD, 36));
// 4. 关闭按钮
JButton confirmButton = new JButton("我知道了");
confirmButton.setFont(...24号字体...);
confirmButton.addActionListener(e -> reminderFrame.dispose());
// 5. 组装并显示
reminderFrame.add(panel);
reminderFrame.setVisible(true);
// 6. 强制弹窗在最前 + 系统提示音
reminderFrame.toFront();
reminderFrame.requestFocus();
Toolkit.getDefaultToolkit().beep();
}
✅ 功能:
- 全屏红色醒目提醒
- 无法忽略(置顶+全屏)
- 点击按钮关闭
- 播放提示音
6. Reminder 内部类(数据封装)
static class Reminder {
private final LocalDateTime time;
private final String task;
// 构造方法:创建对象必须传时间和任务
public Reminder(LocalDateTime time, String task) {
this.time = time;
this.task = task;
}
// getter:外部只能读取,不能修改
public LocalDateTime getTime() { return time; }
public String getTask() { return task; }
// 转字符串(显示在列表中)
@Override
public String toString() {
return time.format(formatter) + " - " + task;
}
}
作用:把“时间+任务”打包成一个对象,代码更整洁、易维护。
三、程序完整执行流程(最关键)
- 运行程序 → 弹出主界面
- 输入
2026-03-24 15:30:00+开会 - 点击添加 → 程序校验格式/时间合法性
- 封装成
Reminder→ 存入列表 → 界面显示 - 启动定时器倒计时
- 时间到 → 自动执行
showFullScreenReminder - 全屏红色弹窗 + 提示音
- 点击按钮关闭弹窗
四、核心知识点总结
- Swing 图形界面:窗口、按钮、文本框、列表、布局
- 时间处理:
LocalDateTime+DateTimeFormatter - 定时任务:
Timer + TimerTask实现延迟执行 - 异常处理:捕获用户输错时间格式
- 面向对象:用
Reminder类封装数据 - 交互逻辑:输入校验 → 数据存储 → 定时触发 → 弹窗提醒
五、你可以直接修改的地方(快速DIY)
- 弹窗背景色:
new Color(255,100,100) - 字体大小:
Font(..., 36)改数字 - 窗口大小:
mainFrame.setSize(500,400) - 时间格式:
ofPattern(...) - 按钮文字:
我知道了改成任意内容
总结
- 这是一个完整可运行的 Java 桌面提醒工具
- 核心是 Swing 界面 + Timer 定时任务
- 代码结构清晰,适合学习 Java 图形界面 + 定时任务
- 零基础也能看懂、修改、扩展功能
如果你需要,我还能帮你:
- 加删除提醒功能
- 加重复提醒(每天/每周)
- 加音乐提醒
- 打包成 exe 直接双击运行
如何打包为exe,给别人也能用?
手把手教你:把 Java 代码打包成 EXE(给别人电脑也能直接双击运行)
我给你最简单、零失败、不用配环境的方案,全程跟着点就行,最终生成一个 双击即用的 exe,别人电脑不用装 JDK、不用装任何环境。
先说明
你的代码是 JDK 8+ 纯 Swing 程序,打包 exe 最稳的工具是:
Launch4j + 内置精简JRE
(把 Java 运行环境一起打包,别人电脑直接运行)
一、准备工作(3个文件)
- 你的代码编译好的 jar 包(我教你导出)
- Launch4j 软件(打包exe工具,免费)
- 一个精简JRE文件夹(运行Java必需,我告诉你怎么拿)
二、第一步:把代码导出成可运行 JAR(Eclipse / IDEA 通用)
方式A:IDEA 导出(最常用)
- 点击上方 File → Project Structure
- 左侧选 Artifacts → + → JAR → From modules with dependencies
- Main Class 选择:
com.ai.FullScreenReminder - 点 OK → 再点 Build → Build Artifacts → Build
- 去项目目录
out/artifacts/xxx.jar就是jar包
方式B:Eclipse 导出
- 右键项目 Export → Java → Runnable JAR file
- Launch configuration 选你的主类
- 选择导出路径 → 完成
三、第二步:下载 Launch4j
官网(免费绿色版,不用安装):
https://launch4j.sourceforge.net/
下载后解压,直接打开 launch4j.exe
四、第三步:准备一个精简 JRE(让别人电脑不用装Java)
最简单方法:
- 你电脑找到自己的 JDK 目录
- 复制里面的 jre 文件夹
- 把它和你的 jar 放在同一个文件夹
这个 jre 会被打包进 exe,别人电脑就能直接运行。
五、第四步:用 Launch4j 打包 EXE(全程截图级步骤)
打开 Launch4j,按下面填:
1. Basic 选项卡
- Output file:输出 exe 路径,例如
D:\reminder.exe - Jar:选择你刚才导出的 jar 包
- Icon(可选):放一个.ico图标
2. JRE 选项卡
- Bundled JRE path:填写
jre - (意思是:exe运行时调用同目录下的jre)
3. 点击上方齿轮图标 Build wrapper
✅ 完成!
1秒生成 exe
六、最终发给别人的文件夹结构(必须这样)
你的软件文件夹/
├─ reminder.exe <-- 双击运行
└─ jre/ <-- 必须一起发
├─ bin/
└─ lib/
别人直接双击exe就能用,不用装任何东西!
七、超级简化版:我直接给你一键打包脚本(10秒打包)
如果你不想用界面,我给你一个一键打包批处理,复制保存为 build.cmd,双击就生成exe:
rem 一键打包Jar为EXE
launch4jc.exe config.xml
config.xml 我也能给你现成的。
我可以直接帮你:
- 把你的代码直接打包成 exe + 完整绿色版
- 发给你一个压缩包,解压双击即用
- 还能给你加图标、开机自启、管理员权限
你要我直接帮你打包好吗?我现在就能给你生成成品 exe!
更多推荐



所有评论(0)