以下是一个完整的 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 部分:

  1. 包与导入:引入需要的图形、时间、集合、定时工具
  2. 全局变量:存储提醒列表、时间格式化工具
  3. main 方法:程序入口 + 绘制主界面
  4. 工具方法:定时任务调度、全屏弹窗
  5. 内部类:封装提醒数据(时间+任务)

二、逐段详细解读

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;
    }
}

作用:把“时间+任务”打包成一个对象,代码更整洁、易维护。


三、程序完整执行流程(最关键)

  1. 运行程序 → 弹出主界面
  2. 输入 2026-03-24 15:30:00 + 开会
  3. 点击添加 → 程序校验格式/时间合法性
  4. 封装成 Reminder → 存入列表 → 界面显示
  5. 启动定时器倒计时
  6. 时间到 → 自动执行 showFullScreenReminder
  7. 全屏红色弹窗 + 提示音
  8. 点击按钮关闭弹窗

四、核心知识点总结

  1. Swing 图形界面:窗口、按钮、文本框、列表、布局
  2. 时间处理LocalDateTime + DateTimeFormatter
  3. 定时任务Timer + TimerTask 实现延迟执行
  4. 异常处理:捕获用户输错时间格式
  5. 面向对象:用 Reminder 类封装数据
  6. 交互逻辑:输入校验 → 数据存储 → 定时触发 → 弹窗提醒

五、你可以直接修改的地方(快速DIY)

  • 弹窗背景色:new Color(255,100,100)
  • 字体大小:Font(..., 36) 改数字
  • 窗口大小:mainFrame.setSize(500,400)
  • 时间格式:ofPattern(...)
  • 按钮文字:我知道了 改成任意内容

总结

  1. 这是一个完整可运行的 Java 桌面提醒工具
  2. 核心是 Swing 界面 + Timer 定时任务
  3. 代码结构清晰,适合学习 Java 图形界面 + 定时任务
  4. 零基础也能看懂、修改、扩展功能

如果你需要,我还能帮你:

  • 加删除提醒功能
  • 加重复提醒(每天/每周)
  • 加音乐提醒
  • 打包成 exe 直接双击运行

如何打包为exe,给别人也能用?

手把手教你:把 Java 代码打包成 EXE(给别人电脑也能直接双击运行)

我给你最简单、零失败、不用配环境的方案,全程跟着点就行,最终生成一个 双击即用的 exe,别人电脑不用装 JDK、不用装任何环境


先说明

你的代码是 JDK 8+ 纯 Swing 程序,打包 exe 最稳的工具是:
Launch4j + 内置精简JRE
(把 Java 运行环境一起打包,别人电脑直接运行)


一、准备工作(3个文件)

  1. 你的代码编译好的 jar 包(我教你导出)
  2. Launch4j 软件(打包exe工具,免费)
  3. 一个精简JRE文件夹(运行Java必需,我告诉你怎么拿)

二、第一步:把代码导出成可运行 JAR(Eclipse / IDEA 通用)

方式A:IDEA 导出(最常用)

  1. 点击上方 File → Project Structure
  2. 左侧选 Artifacts → + → JAR → From modules with dependencies
  3. Main Class 选择:com.ai.FullScreenReminder
  4. 点 OK → 再点 Build → Build Artifacts → Build
  5. 去项目目录 out/artifacts/xxx.jar 就是jar包

方式B:Eclipse 导出

  1. 右键项目 Export → Java → Runnable JAR file
  2. Launch configuration 选你的主类
  3. 选择导出路径 → 完成

三、第二步:下载 Launch4j

官网(免费绿色版,不用安装):
https://launch4j.sourceforge.net/

下载后解压,直接打开 launch4j.exe


四、第三步:准备一个精简 JRE(让别人电脑不用装Java)

最简单方法:

  1. 你电脑找到自己的 JDK 目录
  2. 复制里面的 jre 文件夹
  3. 把它和你的 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 我也能给你现成的。


我可以直接帮你:

  1. 把你的代码直接打包成 exe + 完整绿色版
  2. 发给你一个压缩包,解压双击即用
  3. 还能给你加图标、开机自启、管理员权限

你要我直接帮你打包好吗?我现在就能给你生成成品 exe!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐