这可能是你见过的用JavaSwing开发的最美的软件

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中保持清晰和专注。
根据实际需求,我对软件功能和可视化界面做出以下设计:
这可能是你见过的用JavaSwing开发的最美的软件_第1张图片
软件主要功能为记录待办事项,所以我将软件命名为All Done,并对软件运行流程和功能做进一步抽象如下:

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

二、程序结构

程序逻辑架构如下:
这可能是你见过的用JavaSwing开发的最美的软件_第4张图片
软件可视化界面 面板示意图:
这可能是你见过的用JavaSwing开发的最美的软件_第5张图片

软件结构:
软件采用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类,进行颜色,形状,大小等属性重绘实现的。

源程序列表及开发用时:

这可能是你见过的用JavaSwing开发的最美的软件_第6张图片

总用时:这可能是你见过的用JavaSwing开发的最美的软件_第7张图片
欢迎star, pull request.    
其实有一说一,用Java写GUI是真的自虐。

你可能感兴趣的:(JAVA,Java,swing,gui,程序设计,软件开发)