ALL_DONE

This is a To-do list program written in Java. It references Microsoft’s TO-DO.
代码总量:18个类,1630行
项目开源地址:Github地址https://github.com/chuiyukong/ALL_DONE.git

刚学Java,这个项目从IO到多线程都有涉及,让我学到最多的是与编写往的单一功能程序相比,这样的综合性软件需要考虑软件的设计模式和软件架构,否则开发到后面结构混乱。
         这个项目总代码量一千多两千行,几十个类,后面出现的BUG比前面实现的功能还多,调试起来非常困难。

用法:

​ 使用IDEA导入项目后,使用jdk1.8 及以上编译器,执行Launcher.java。关于打包成jar包和.exe文件 ,经过一番尝试后,由于源码中对于资源文件的依赖,使得打包后程序执行找不到对应目录,需要将源码所有的文件导入方式进行更改。

演示:

一、设计思路

一开始将题目理解为一个日历表,向其中添加备忘录,但是对于使用者来说,主要的功能是做备忘,待办事项查看,到时提醒等功能,日历表反而是冗余的内容。所以结合我的理解和实际的需求,我将题目理解为设计一个实用性强的,简洁的,具有备忘,提醒等功能的个人代办事项记录程序,让用户在繁杂的DDL中保持清晰和专注。
根据实际需求,我对软件功能和可视化界面做出以下设计:

软件主要功能为记录待办事项,所以我将软件命名为All Done,并对软件运行流程和功能做进一步抽象如下:

同时,考虑到美观性,我对软件Logo和图标使用设计软件CorelDRW进行如下设计:
欢迎界面:

图标:

程序设计思想:
本次开发任务较为复杂,需要在充分利用Java面向对象编程的同时,考虑软件逻辑架构,在本项目中,采用了MVC设计模式:模型(model)-视图(view)-控制器(controller),使用业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。这种开发模式让我充分感受到了设计模式对于软件开发的重要性,在不知道后面的功能如何实现时,提前将各部分分离,抽象出参数,接口等,大大减小了各部分,各功能的耦合性,使得我在后面的开发中不必受到太多已开发部分代码的约束,添加和修改功能不至于牵一发而动全身。
本软件共计编写14个类,以及8个测试类,共计22个类,总代码量2063行。具体设计思想的体现将在后面的程序结构表述中介绍。

二、程序结构

程序逻辑架构如下:

软件可视化界面 面板示意图:

软件结构:
软件采用MVC设计模式,将右侧面板分为三个,根据左侧按钮的监听情况,显示右侧对应面板,并将控制器类单独抽取为Panel_Selector.java类,用于连接和处理左右面板(panel01,panel02)之间的逻辑业务。而主窗体类MainFrame.java 只负责显示。然后将右侧的三个面板抽象为Panels.java类,在这个类中只负责显示任务。其中的组件和事件逻辑由于三个面板结构和功能很几乎一致,这里全部抽象为一个类:Components.java,然后在Panels.java中实例化Components.java的对象,根据Panel_Selector.java中对三个按钮的监听情况,传入不同的三种参数,实现一个类控制三个不同的面板。利用了面向对象的设计思想以及表现层,逻辑层,持久层分离的设计模式。
同时,又将右侧面板panel02使用分割面板分割为左右两个面板:L_Panel和R_Panel,目的是要实现点击左侧L_Panel中的任务列表,右侧R_Panel弹出各个任务对应的详情和操作面板。这里实现步骤较为复杂,每次添加任务都向持久层调用Log_IO.java类写入文本,然后每次添加任务都调用左侧初始化函数L_init()方法,重新载入本地文件,创建按钮组,从而实现实时显示新建的任务按钮。点击任务按钮时,调用右侧初始化函数R_init()方法,同理载入本地备注文件,载入任务完成状态,根据任务完成状态显示任务图标。同时,在右侧R_Panel中可将任务删除,或将任务设为完成状态。这些都调用了持久层的Log_IO.java类进行文件读写,(如果点击了完成任务,还将启动多线程播放完成音效,ps:音效的播放本来可以用Applet类的方法,但是在IDEA中已经被弃用,所以我导入了一个专门播放音乐的外部类JLayer1.0.1:jl1.0.1.jar包)然后每次进行IO操作后都会调用左右面板初始化方法:L_init(),R_init(),所以这里就会出现两个初始化函数在监听器中互相递归循环调用。具体细节就还不展开浪费篇幅了。
总体上,通过这次开发,我体会到了代码结构组织方式的重要性,以及抽象带来的简洁,特别是将一些变量设为final静态属性作为参数传递,这使得代码变得灵活。

三、调试、运行结果

实现功能及运行结果:
1.程序启动后显示欢迎界面,同时启动音效播放线程,欢迎界面关闭后显示主窗体,主界面显示欢迎标语和系统时间;
2.可以设置软件主题色;
3.可以设置窗体最小化到系统托盘;
4.可以设置隐藏窗体标题栏(隐藏标题栏后,在左面板添加退出按钮,未隐藏标题栏时不显示退出按钮);
(2,3,4设置可保存到本地配置文件,程序启动时按照配置文件进行设置初始化)
5.程序分为左右两侧面板,点击左侧切换栏,右侧面板显示对应任务;
左侧界面:
6.点击左侧切换栏时,显示点击效果:选中的按钮:字体加粗,按钮显示边框,字体和边框颜色跟随主题色。未选中的按钮重置各项UI。同时显示任务数量
7.左侧按钮全部设置图标,并点击顶部按钮:All Done时,弹出设置窗体,可在设置窗体中设置主题色,是否最小化到系统托盘,是否隐藏标题栏。并在点击完成后将设置保存到本地配置文件config.txt中。
8.在设置窗口中,添加BUG反馈按钮,点击按钮后自动唤醒系统默认浏览器,进入我的Github 中的All Done项目页面。搜索按钮点击后自动打开百度。
右侧界面:
9.右侧分为:今日任务,重要,所有任务三个面板,点击左侧按钮时,右侧面板切换至对应面板,并隐藏其他面板,同时使其失效。
10.抽象出以上三个面板的功能:读取本地Mission.txt文件,根据文件内容在面板中创建按钮数组,同时将按钮数组添加到滚动面板,添加滚动条。
11.添加输入窗口,并且输入框在鼠标未聚焦时显示提示信息:“+ 添加任务”。并将输入内容写入Mission.txt文件,然后启动L_init()函数,重新载入本地文件,进行初始化创建按钮,从而实现按钮的实时添加。
12.点击任务按钮后展开详情和操作面板。可以在面板中将任务设为完成,删除,添加备注,或者修改任务内容。
13.关于一些细节:左侧按钮框 点击效果通过监听器逻辑实现,为实现任务按钮 圆角边框,背景色,点击效果和点击颜色等定义了MyButton.java继承Jbutton然后重新绘制边框,深度自定义了按钮的UI。同样,为了追求美观,滚动条 也是定义了DemoScrollBarUI.java类,进行颜色,形状,大小等属性重绘实现的。

源程序列表及开发用时:

总用时:
欢迎star, pull request.    
其实有一说一,用Java写GUI是真的自虐。

用JavaSwing也能写出win10扁平风的软件相关推荐

  1. 如何写出一份优秀的软件设计文档

    作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: · ...

  2. 【译】如何写出一份优秀的软件设计文档

    作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: 为什 ...

  3. 如何从数据库中筛选出达成指定里程碑节点的项目_【译】如何写出一份优秀的软件设计文档...

    作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: 为什 ...

  4. python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!

    我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...

  5. 如何写出优雅的 Golang 代码

    Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...

  6. 教你写出可读性高的Python代码

    如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性.确实,对于 Python 来说,其高可读性一直是这门语言设计的核心.一个不争的事实是,相对 ...

  7. 如何写出更具有Python风格的代码

    我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...

  8. 请写出查询该表中成绩最大值的sql语句_SQL-汇总分析

    一.汇总函数(Aggregate Functions) count(列名):求某列的行数 sum(列名):对某列的数据求和 avg(列名):对某列的数据求平均值(只能对数值类型的列计算) max(列名 ...

  9. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7.5 使用StAX写出XML文档

    3.7.5 使用StAX写出XML文档 在前一节中,你看到了如何通过写出DOM树的方法来产生XML文件.如果这个DOM树没有其他任何用途,那么这种方式就不是很高效. StAX API使我们可以直接将X ...

最新文章

  1. Cocos2D研究院之精灵与动画
  2. 一个Demo展示Storyboard的强大
  3. 赠书福利 | 首本理论和实战结合的深度学习书籍
  4. netty系列之:自定义编码和解码器要注意的问题
  5. 某公司邮件系统的安全检测
  6. bitmap与memoryStream转换bug
  7. 优化 ASP.NET Core Docker 镜像的大小
  8. 使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述
  9. python之file 方法
  10. MySQL密码忘记,怎么办?
  11. 利用jquery实现电商网站常用特效之:五星评分
  12. KL距离-Kullback-Leibler Divergence
  13. 如何在ImageRanger中设置人脸识别来整理照片分类
  14. 通信原理包络是什么意思_自己总结的通信原理部分知识点
  15. SPSS 特征筛选、主成分回归
  16. 中国.NET:各地微软技术俱乐部汇总(更新中...)
  17. 32768强制转换成short类型和char类型为什么是-32768和0?
  18. 脱虚向实,数说故事联合中山大学正式启动“AI虚拟偶像”研究计划
  19. 06、NMAP高级使用技巧和漏洞扫描发现
  20. matlab创建反正弦asin,JavaScript中反正弦函数Math.asin()的使用简介

热门文章

  1. RabbitMQ安装rabbitmq_delayed_message_exchange插件(死信队列所需插件)
  2. 还在苦恼怎么学PS、编程?这五个自学网站免费教!年薪百万不是梦
  3. 北京航空航天大学计算机系考研复试上机真题及答案---2014
  4. 经济寒冬影响存储专业人士
  5. opencv 开操作-闭操作 礼帽-黑帽作用
  6. 安装Deb软件的方法
  7. scrapy 学习笔记1 爬取 www.dmoz.org 网站信息
  8. java如何创建列表的表头,java word设置表头
  9. 项目管理软件中有哪些技术风险?
  10. 关于创建的虚拟机mac 无法调整分辨率