一 主类:MainFrame
(1)导航树:创建树中结点(组合)
(2)下载表格:新建表格、表格模型、将表格模型赋给表格
(3)信息列表:用List<Info>装了四个Info,然后提交给JList。
(4)新建任务界面 界面(Box)、按钮的监听
(5)工具栏(5个Action):新任务、开始、暂停、删除任务、移除已经完成任务
(6)悬浮窗口:主窗口、弹出菜单(与托盘同) 内嵌在主类中
(7)任务栏图标(6个菜单):打开/关闭、新任务、开始、暂停、移除完成、退出
监听器:
(1)点击表格,鼠标监听器,列表显示信息。
(2)点击导航树,鼠标监听器,得到选择节点,刷新表格,表格得到模型,模型重设资源对象。
(3)窗口关闭监听。
(4)任务栏图标的监听。
开始所有任务调用DownloadHandler的resumeDownload()。
删除已下载完的,就从DownloadContext中的resources删除该项。
退出前,先序列化保存。这样可以断点续传。
二:
(2)导航树类
节点提交给树、设置树、设置渲染器。
(3)树渲染器类 设置该JLabel的图标和名称
三:
(4)表格类 设置表格的列宽、设置表格列的渲染器
(5)表格模型类 表格所拥有的列名数组、资源集resources、根据资源集返回某单元格值
(6)表格渲染器类 设置一个单元格中的显示
(7)进度条类 (也是一个渲染器)
四:
(8)新建任务界面类 创建资源,调用DownloadHandler类的doDownload(r)方法。
(9)悬浮窗类 菜单和监听
五:
(10)节点类:
共同父类:DownloadNode
任务TaskNode、正在下载DownloadingNode、下载失败FailNode、下载完成FinishNode
六:
(11)Info信息类:信息列表中的信息对象。
七:
(12)资源对象:
Resource属性:关联的类part、
(1)资源id。(2)地址url。(3)保存目录filePath。(4)改后的名称fileName
(5)状态state。(6)文件大小size。(7)下载起始时间downloadDate
(8)进度progress.(9)下载速度speed。(10)使用的时间costTime(11)剩下的时间spareTime
(12)拆分的块集合parts(13)线程数threadSize。(14)上一次下载的大小 preLength
根据每个块,计算出当前的总长度currentLength。
计算下载速度speed。 即:当前的总长度-上一次长度
通过Http的连接(根据url),得到文件总共的大小size。
计算进度progress。 当前的总长度/总大小
计算剩余时间spareTime。 总大小-当前的总长度/速度
设置状态时,要原状态销毁,新状态初始化执行。
八:工具集
(13)文件工具类
(1)根据地址名得到文件名。(2)删除part临时文件
(14)图片工具类
存储图片的地址,返回图片信息。
(15)日期工具类
给时间格式化
九:
(15)ContextHolder上下文支持类:
包含 DownloadContext和DownloadHandler
为了保证这两个对象都只有一份,并且随时随地都可用。
十:DAO类
(16)下载工具上下文 DownloadContext
包含5个状态、当前程序的资源集List<Resource> resources
两种方式来访问:
(1)根据状态,得到资源集resources
(2)根据资源id查找具体资源
(17)下载状态类
接口TaskState、抽象类AbstractState
连接Connecting、下载Downloading、完成Finished、失败Failed、暂停Pause
完成Finished:stopTimer(resource)。停止CountTimeTask
失败Failed:stopTimer(resource)。停止CountTimeTask
暂停Pause:stopTimer(resource)。停止CountTimeTask
十一:
(18)下载处理类 DownloadHandler
(1)doDownload(r)开启时间计算任务CountTimeTask,给每part分配任务,开启线程
(2)stopTimer(r)就是停止了时间增长。resumeDownload(r)继续原来任务。
(19)下载的线程类DownloadThread
从服务器读资源到本地。资源的状态的设定。主要的逻辑。
十二:
(20)Part拆分成的块。
开始位置begin、这个part文件的长度length、
该Part已经下载的文件长度currentLength、每个Part对应的文件名partName(自动生成)。
注:
Action对象
(1)容器类JMenu、JToolBar会为Action对象自动创建组件,并注册监听器。
jToolBar.add(action);
(2)Swing组件JButton、JCheckBox用构造方法创建。
jButton = new JButton(action);
输入信息:(1)下载地址(2)保存目录(3)文件名(4)线程数
悬浮窗口与任务栏图标都是调用主类中的几个方法。
图片加载步骤:图片路径(String),得到File,通过ImageIO()类读取得到BufferedImage对象。
得到选择树的节点信息步骤:
先是treePath = navTree.getSelectionPath();
然后node = (DefaultMutableTreeNode)treePath.getLastPathComponent();
最后(DownloadNode)node.getUserObject();
Resource属性:
(1)资源id。(2)地址url。(3)保存目录filePath。(4)改后的名称fileName
(5)状态state。(6)文件大小size。(7)下载时间downloadDate
(8)进度progress.(9)下载速度speed。(10)使用的时间costTime(11)剩下的时间spareTime
(12)拆分的块parts(13)线程数threadSize。(14)上一次下载的大小 preLength
对于Resource对象,需要外部传进来赋值的成员就用set方法,否则自己生成。对于状态的设置(起始就是状态的转变),因为设置状态,还要对状态进行处理,所以编写了代码。
自动生成的id。UUID.randomUUID().toString();
根据url作连接:
URL resourceURL = new URL(this.url);
HttpURLConnection urlConnection = (HttpURLConnection)resourceURL.openConnection();
urlConnection.connect();
this.size = urlConnection.getContentLength();
urlConnection.disconnect();
显示出资源:表格的模型、ContextHolder、DownloadContext、Resource。
资源在模型和上下文DownloadContext中是顺序存储的。
行是具体哪个资源,列是资源的成员。
设定资源:主面start()、DownloadHandler的resumeDownload、doDownload、DownloadThread
所谓刷新表格,就是重设资源对象。
表格的getValue()方法调用了模型的getValue()方法。
将DownloadContext上下文对像写到序列化文件中。
反序列化完成后,将DownloadContext中的resources存到模型中,然后表格刷新。
每个资源都要有个花费的时间,故有个计算时间的任务。
urlConnection.getInputStream();
流需要关闭、连接需要关闭、文件需要关闭。
下载过程:服务器端到流InputStream,流到内存缓冲区buffer,在到文件RandomAccessFile。
最后合并part文件。