用JavaSwing也能写出win10扁平风的软件
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扁平风的软件相关推荐
- 如何写出一份优秀的软件设计文档
作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: · ...
- 【译】如何写出一份优秀的软件设计文档
作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: 为什 ...
- 如何从数据库中筛选出达成指定里程碑节点的项目_【译】如何写出一份优秀的软件设计文档...
作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: 为什 ...
- python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!
我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...
- 如何写出优雅的 Golang 代码
Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...
- 教你写出可读性高的Python代码
如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性.确实,对于 Python 来说,其高可读性一直是这门语言设计的核心.一个不争的事实是,相对 ...
- 如何写出更具有Python风格的代码
我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...
- 请写出查询该表中成绩最大值的sql语句_SQL-汇总分析
一.汇总函数(Aggregate Functions) count(列名):求某列的行数 sum(列名):对某列的数据求和 avg(列名):对某列的数据求平均值(只能对数值类型的列计算) max(列名 ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7.5 使用StAX写出XML文档
3.7.5 使用StAX写出XML文档 在前一节中,你看到了如何通过写出DOM树的方法来产生XML文件.如果这个DOM树没有其他任何用途,那么这种方式就不是很高效. StAX API使我们可以直接将X ...
最新文章
- Cocos2D研究院之精灵与动画
- 一个Demo展示Storyboard的强大
- 赠书福利 | 首本理论和实战结合的深度学习书籍
- netty系列之:自定义编码和解码器要注意的问题
- 某公司邮件系统的安全检测
- bitmap与memoryStream转换bug
- 优化 ASP.NET Core Docker 镜像的大小
- 使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述
- python之file 方法
- MySQL密码忘记,怎么办?
- 利用jquery实现电商网站常用特效之:五星评分
- KL距离-Kullback-Leibler Divergence
- 如何在ImageRanger中设置人脸识别来整理照片分类
- 通信原理包络是什么意思_自己总结的通信原理部分知识点
- SPSS 特征筛选、主成分回归
- 中国.NET:各地微软技术俱乐部汇总(更新中...)
- 32768强制转换成short类型和char类型为什么是-32768和0?
- 脱虚向实,数说故事联合中山大学正式启动“AI虚拟偶像”研究计划
- 06、NMAP高级使用技巧和漏洞扫描发现
- matlab创建反正弦asin,JavaScript中反正弦函数Math.asin()的使用简介
热门文章
- RabbitMQ安装rabbitmq_delayed_message_exchange插件(死信队列所需插件)
- 还在苦恼怎么学PS、编程?这五个自学网站免费教!年薪百万不是梦
- 北京航空航天大学计算机系考研复试上机真题及答案---2014
- 经济寒冬影响存储专业人士
- opencv 开操作-闭操作 礼帽-黑帽作用
- 安装Deb软件的方法
- scrapy 学习笔记1 爬取 www.dmoz.org 网站信息
- java如何创建列表的表头,java word设置表头
- 项目管理软件中有哪些技术风险?
- 关于创建的虚拟机mac 无法调整分辨率