任务倒计时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

相关文章

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文

同城跑腿APP开发,随叫随到超方便!

随着移动互联网的发展和人们生活节奏的加快,越来越多的人们没有闲暇的时间来做一些繁琐的事情,比如说买药、挂号、排队、送花、取文件等等。如果没有时间去处理这些事情怎么办?开发同城跑腿APP,提供跑腿服务,随时办事随时下单,只需在手机上轻轻一点,就可完成跑腿需求。 首先,跑腿小程序有几种开发方式。第一种是自己组建开发,这种方式比较适合有软件开发能力的企业,比较花费时间和金钱成本。第二种是找到第三方

linux cron /etc/crontab 及 /var/spool/cron/$USER 中定义定时任务

简介 定时任务在linux上主要体现在两个地方,一个是/etc/crontab ,另一个就是定义了任务计划的用户/var/spool/cron/$USER 1、crontab -e 或者直接编辑/etc/crontab文件,这种方式用的人比较多,/etc/crontab是系统调度的配置文件,只有root用户可以使用,使用时需root权限,而且必须指定运行用户,才会执行 * * * * * *

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频率。 2. 技术要点 Spark Streaming集成: 与Spark生态的其他组件如Spark SQL、ML

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app:我们选择了uni-app作为开发框架,因为它基于Vue.js,允许我们编写一次代码,发布到多个平台,包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能,极大提升了开发效率。 图鸟UI:图鸟UI是基于uni-app的UI框架,它提供了大量美观且实用的组件和页面模板,帮助我们快速构建出风格统一、用户体

H5唤醒APP方法,H5唤醒不了App跳下载页

H5唤醒APP方法,H5唤醒不了App跳下载页 let ua = window.navigator.userAgent.toLowerCase();let src = {iphone: /iphone/i.test(ua),android: /android/i.test(ua),windows: /windows/i.test(ua),weixin: /micromessenger/i.te

【FreeRTOS】任务管理与调度

文章目录 调度:总结 调度: 相同优先级的任务轮流运行最高优先级的任务先运行 可以得出结论如下: a 高优先级的任务在运行,未执行完,更低优先级的任务无法运行b 一旦高优先级任务就绪,它会马上运行(假设厨房着火了,会马上去灭火)c 如果最高优先级的任务有多个,他们轮流运行 他们都是使用链表进行管理 打开CubeMX,最高优先级56 56个List, Rad

移动终端app测试点总结

以下所有测试最后必须在真机上完整的执行1、安装、卸载测试 在真机上的以及通过91等第三方的安装与卸载安装在手机上还是sd卡上 2、启动app测试3、升级测试  数字签名、升级覆盖安装、下载后手动覆盖安装、跨版本升级、升级后可以正常使用。  覆盖安装要确保数据库有字段更新的话,能正常更新,否则就容易导致app异常。4、功能测试  包括功能点、业务逻辑、关联性(主要测试客户端与PC端的交互,客户端