任务倒计时App

2024-06-11 22:36
文章标签 倒计时 app 任务

本文主要是介绍任务倒计时App,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计背景

在某一阶段可能需要给自己设置长期任务,比如找工作、考研等,需要一个单纯的任务计时工具,设置完任务的目标时间后,每次打开App时都能直接看到最新的剩余时间

设计步骤

1. 写java源码

由于需要界面显示,需要用到swing库等,以下是源码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.List;public class CountdownTimer extends JFrame {private JTextField taskNameField;private JTextField dateTimeField;private JLabel messageLabel;private static final String FILE_PATH = "tasks.txt";private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");private List<Task> tasks = new ArrayList<>();private JPanel tasksPanel;public CountdownTimer() {setTitle("倒计时器");setSize(600, 400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);// 创建输入框和按钮taskNameField = new JTextField(10);dateTimeField = new JTextField(20);messageLabel = new JLabel("输入任务名和目标时间 (yyyy-MM-dd HH:mm:ss)", SwingConstants.CENTER);JButton addButton = new JButton("添加任务");// 添加事件监听器addButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {addTask();}});// 布局setLayout(new BorderLayout());JPanel inputPanel = new JPanel();inputPanel.add(new JLabel("任务名:"));inputPanel.add(taskNameField);inputPanel.add(new JLabel("目标时间:"));inputPanel.add(dateTimeField);inputPanel.add(addButton);tasksPanel = new JPanel();tasksPanel.setLayout(new BoxLayout(tasksPanel, BoxLayout.Y_AXIS));add(inputPanel, BorderLayout.NORTH);add(new JScrollPane(tasksPanel), BorderLayout.CENTER);add(messageLabel, BorderLayout.SOUTH);// 读取并启动倒计时loadTasks();}private void addTask() {String taskName = taskNameField.getText();String targetDateTimeStr = dateTimeField.getText();try {LocalDateTime targetDateTime = LocalDateTime.parse(targetDateTimeStr, formatter);Task task = new Task(taskName, targetDateTime);tasks.add(task);saveTasks();displayTasks();taskNameField.setText("");dateTimeField.setText("");messageLabel.setText("任务添加成功!");} catch (Exception ex) {messageLabel.setText("请输入正确的日期时间格式: yyyy-MM-dd HH:mm:ss");}}private void displayTasks() {tasksPanel.removeAll();for (Task task : tasks) {JPanel taskPanel = new JPanel(new BorderLayout());JLabel taskLabel = new JLabel();taskPanel.add(taskLabel, BorderLayout.CENTER);JButton deleteButton = new JButton("删除");deleteButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {tasks.remove(task);saveTasks();displayTasks();}});taskPanel.add(deleteButton, BorderLayout.EAST);tasksPanel.add(taskPanel);startTimer(task, taskLabel);}tasksPanel.revalidate();tasksPanel.repaint();}private void startTimer(Task task, JLabel taskLabel) {java.util.Timer timer = new java.util.Timer();timer.scheduleAtFixedRate(new java.util.TimerTask() {@Overridepublic void run() {LocalDateTime now = LocalDateTime.now();long seconds = ChronoUnit.SECONDS.between(now, task.getTargetDateTime());if (seconds <= 0) {taskLabel.setText("<html>" + task.getName() + ": <font size='5'>时间到了!</font></html>");timer.cancel();} else {long years = ChronoUnit.YEARS.between(now, task.getTargetDateTime());now = now.plusYears(years);long months = ChronoUnit.MONTHS.between(now, task.getTargetDateTime());now = now.plusMonths(months);long days = ChronoUnit.DAYS.between(now, task.getTargetDateTime());now = now.plusDays(days);long hours = ChronoUnit.HOURS.between(now, task.getTargetDateTime());now = now.plusHours(hours);long minutes = ChronoUnit.MINUTES.between(now, task.getTargetDateTime());now = now.plusMinutes(minutes);long secs = ChronoUnit.SECONDS.between(now, task.getTargetDateTime());String timeText = String.format("%d年 %d月 %d天 %02d小时 %02d分 %02d秒",years, months, days, hours, minutes, secs);// Pad numbers with zeros to ensure stable layoutString paddedTimeText = timeText.replaceAll("\\b(\\d)\\b", "0$1");// Format the time text with HTML tags to set different font sizesString formattedText = "<html>" + task.getName() + ": ";formattedText += "<font size='5'>" + paddedTimeText + "</font></html>";taskLabel.setText(formattedText);}}}, 0, 1000);}private void saveTasks() {try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {for (Task task : tasks) {writer.write(task.getName() + ";" + task.getTargetDateTime().format(formatter));writer.newLine();}} catch (IOException e) {e.printStackTrace();}}private void loadTasks() {tasks.clear();try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(";");if (parts.length == 2) {String taskName = parts[0];LocalDateTime targetDateTime = LocalDateTime.parse(parts[1], formatter);tasks.add(new Task(taskName, targetDateTime));}}displayTasks();} catch (IOException e) {messageLabel.setText("尚未设置任务。");}}public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {new CountdownTimer().setVisible(true);}});}
}class Task {private String name;private LocalDateTime targetDateTime;public Task(String name, LocalDateTime targetDateTime) {this.name = name;this.targetDateTime = targetDateTime;}public String getName() {return name;}public LocalDateTime getTargetDateTime() {return targetDateTime;}
}

2. 将java源码转为jar文件

  JAR文件是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。
  将源码转为jar文件具体可参考这篇博客:如何将.java文件转为.jar

3. 使用launch4j工具将jar文件转为exe可执行文件

具体步骤可参考这篇博客:luanch4j转exe

App展示

这是App的界面演示
在这里插入图片描述
App自取链接:https://pan.baidu.com/s/1C5Nc5ZsdFsSVU3-SEEsdVA
提取码:dddd

开机自启动

若是想开机直接能看到程序启动,
1.记好转好的jar文件地址
2. 用记事本写一个文件,内容为: java -jar “jar文件的地址” ,随后将文件后缀改为.bat
3. win+R打开运行窗口,输入shell:startup,打开开机自启动文件夹,将前面得到的.bat文件放入这个文件夹中即可

这篇关于任务倒计时App的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052443

相关文章

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe