Skip to content

基于 java swing 开发的资源管理器。使用 java swing 美化包beautyeye对原生的 java swing 优化。

Notifications You must be signed in to change notification settings

wangty225/FileExplorer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 

Repository files navigation

FileExplorer

基于 java swing 开发的资源管理器。使用 java swing 美化包beautyeye对原生的 java swing 优化。

实习内容

实现一个文件系统

1. 功能要求

  • 界面上显示树形目录结构
  • 根节点是“我的电脑”
  • “我的电脑”下有几个盘符(C、D、E等)就有几个子节点,递归显示文件系统下的所有文件信息(分支可以是目录也可以是文件,叶子节点都是文件)
  • 能够创建目录、创建文件、删除目录、删除文件、复制文件、粘贴文件

2. 界面要求:界面要友好,让用户操作使用起来非常方便


演示效果:

主页

Image text

弹出菜单页

Image text

文件复制页面(多线程,可以同时复制多个)

Image text

文件属性页面

Image text

打开多级窗口,允许程序多开(多线程)。

Image text

关于本系统 系统帮助

Image text

注:左下角会提示当前选中的目录有多少“一级子项目”


一、实习题目与要求:

实现一个文件系统

1.1 功能要求

i. 界面上显示树形目录结构 ii. 根节点是“我的电脑” iii. “我的电脑”下有几个盘符(C、D、E等)就有几个子节点,递归显示文件系统下的所有文件信息(分支可以是目录也可以是文件,叶子节点都是文件) vi. 能够创建目录、创建文件、删除目录、删除文件、复制文件、粘贴文件

1.2 界面要求:

界面要友好,让用户操作使用起来方便

二、需求分析

2.1 一点想法

  初拿到这题的时候,都会觉得,这个简单!做过!   但是!想想上学期的java作业我的“FileExplorer V1.0”,用java swing 写的,没什么架构,功能单一,甚至有些功能上还存在着潜在的缺陷。所以这次我打算头开始写。 选择语言方面,由于考虑安全性的JavaScript 已逐渐抛弃的本地文件访问,所以做成静态网页就显得不合乎实际。   由于题目要求为桌面应用程序开发,考虑三种方式:① python + QT ② C++ 和 QT ③Java 和 Swing。   本项目选择方式③。

2.2 几个方面:

  1. 首先是文件结构,改用MVC结构,同样基于java 编程 和Swing GUI。按编程项目规范优化目录结构( src(m,v,c), image, doc, lib, … )

  2. 其次是界面美化,做出“扁平化效果”,以显得更简洁。

  3. 另外,多线程思想。不会使文件复制移动的时候GUI假死,增加进度条显示,窗口多开等等。

  4. 异常处理的完善,和信息校验等,保证程序相对健壮。

  5. 尝试使用算法,如递归实现删除文件夹,尝试BFS做一个文件的搜索

2.3 问题描述

类比windows资源管理器,分析主要核心功能有:

  1. 文件的复制,剪切,粘贴。(多线程)

  2. 文件(夹)的删除。(递归算法实现)

  3. 新建文件,文件夹。

  4. 扩展功能:文件(夹)属性查看;在某一目录下根据文件名查找文件(夹);程序的“多开”;根据给定的目录跳转到指定文件(夹);目录的上一页(前进),下一页(后退);菜单栏的实现;通过键盘的快捷键操作;

2.4 系统环境

由于java是基于JVM的,所以运行无特别系统限制。通用于windows。linux上需要对代码稍加修饰。

JDK 1.8及以上java环境; 依赖的外部包: Beautyeye_inf.jar ——java swing 风格包。

三、软件设计与实现

3.1 数据结构与存储结构的设计

  由于本系统主要是对文件操作,需要的数据即硬盘文件,硬盘文件采用的树状目录结构。所以可以打造一颗“JTree”,用来存储文件结构;通过“JTable”显示文件夹下的所有文件及一些基本信息。   理论上,可以通过递归的方法将文件初始化进Jtree,但实际操作,会因为硬盘文件内容众多,导致JVM内存不足,或者运行出来异常卡顿,程序容易死掉,无法实现相关功能,所以需要为了更好的效果,需要另寻它法。   这里我才用的动态加载目录节点的信息。当左侧的JTree的节点被点击时,分析目录结构,更新左下角的信息“该文件夹下有多少子项目”,实现预加载。当结点被展开时,所有子项目被添加到点击的节点上,达到节点的更新。节点折叠时,移除所有子节点,以减少资源占用,同时更方便更新UI。

3.2 算法设计

  ①文件的定位。树层序遍历的思想和寻找根节点到叶子节点的思想。首先对需要定位的文件路径进行分析,切割成小块,每一块代表一个节点名称(文件名称),每次遍历一级目录,如果遇到对应的文件,则将该节点展开。依次循环,处理完所有“块”之后,即可定位到目标文件,同时完成根节点到目标文件的动态构建。

  ②文件的搜索。搜索有三种方式:一种是仅对当前目录低一级的子项目搜索,时间复杂度O(n);第二种是对当前文件夹所有子文件进行搜索,需要递归,可以选择BFS,或者DFS的算法实现;第三种是全硬盘下的文件搜索。(二,三方法最好采用多线程,避免搜索过多占用主进程CPU资源,页面假死)

  ③文件的复制(核心)。采用字节流的方式,每次循环:先读入一定数量的文件字节,然后写入另一个文件,之后累加计算已经复制的百分比,更新进度条进swing的EventQueue队列,进入下一次循环。

多线程调用方式:

  主进程中再新开一个进程,执行自己写的paste()函数,paste()函数首先开一个创建JProgressBar的窗口Gui进程run0()并通过SwingUtilities.invokeLater(run0);将其加入Swing的EventQueue()中并执行。然后创建一个用来更新Ui的进程run()等待调用,然后paste()开始在while(){}中执行文件的读写,每读写一次,执行一次run(),Ui即可更新一次。
  首先在外部定义两个进程。一个是JProgressBar的窗口Gui进程,另一个是copy后台进程。

  线程调用关系: Image text

3.3 模块设计 & 类的函数成员和数据成员设计

3.3.1 项目目录: Image text

3.3.2 MVC架构:

  1. 主要思想:将窗口的每个部分模块化,每个小模块对应一个controller。

FileModel为一个file属性的扩展,除了file已有的函数,增添了一些属性,如获得文件大小(getFileSize(), 返回值为xxxB, xxxKB, xxxMB, xxxGB, xxxTB的字符串),获得文件的创建时间getCreateTime(),修改时间getModifiedTime(), 访问时间getLatestAccessTime()等等。

FileModelController()则包含一些静态成员方法,如:

  • 文件(夹)的粘贴paste()

  • 删除delete(), deleteDir()

  • 新建CreateMyFile(), CreateMyDir()等

  1. FileTablePanel为一个Panel属性的扩展类,返回设计好的包含jTable的Jpanel。

FileModelController()则包含一些可以用于Table更新显示成员方法。 如:IniTable(), SetTable()等。

  1. FileTreePanel为一个Panel属性的扩展类,返回设计好的包含jTree的Jpanel。FileTreeController()则包含一些可以用于Tree更新显示成员方法。 如:树的节点展开监听操作, 树的节点折叠舰艇操作等。等。

  2. MyMenuBar, MyPopupMenu, NavigatePanel类比同上。

  3. PropertiesWindow,文件的属性窗口,通过PropertiesController更新显示。

  4. AboutWindow是menuBar上“关于本系统”功能显示窗口。(本打算通过解析docs目录下的About.json文件设置相关内容,已达到可以从外部直接更新的办法,该程序中尚未使用此方式。)

  5. Help 读取docs目录下的Help文本文件,显示在界面上。可以以用来包括系统介绍,功能使用说明,快捷键等。做成外部文件读取的方式,便于更新维护升级。

另:一些组件的监听操作,添加在MainWindows中,调用controller中相应方法,传递相应的参数,实现功能。

Image text

3.4 界面设计及其它模块设计与实现

3.4.1 主页

Image text

3.4.2 弹出菜单页

Image text

3.4.3 文件复制页面(多线程,可以同时复制多个)

Image text

3.4.4 文件属性页面

Image text

3.4.5 打开多级窗口,允许程序多开(多线程)。

Image text

关于本系统 系统帮助

Image text

注:左下角会提示当前选中的目录有多少“一级子项目”

四、调试信息

4.1 主要问题及解决办法。

问题1:某些组件使用updataUI()虽然能更新成功,但是会报错。

原因分析解决:Swing 不是线程安全的,采用EventQueue(),一个主进程,只有加入队列的操作才会被调用。所以选择更改代码写法: SwingUtilities.invokeLater(xxx.UpdateUI());

问题2:复制或者文件时,界面假死,只有复制或移动结束,才会更新一次UI,JProgressBar没有中间过程。

原因分析解决:因为复制或者移动涉及到的粘贴,会大量读写文件,大量占用资源,再加上Swing不是线程安全的,造成线程阻塞,UI停止更新。而复制或移动结束后,CPU资源得以释放,再来处理Swing的UI更新。解决:把耗资源的线程单独拿出来放在后台执行,通过另一个线程不断的SwingUtilities.invokeLater(run) 更新前端UI, 页面就不会卡死,可以看到进度信息了。线程调用模式参考本文档中“算法设计③”中的图形。

4.2 对设计和编码的回顾讨论和分析;

  这次阶段性阶段性项目实训,让我更加认识到MVC的重要性,以及设计MVC的复杂,需要多多实践培养这种思想,使代码更标准化,更易懂,更易维护。   同时我认识到多线程在处理并发任务,前后端交互的重要地位!   还有,学习算法,不仅是一种思想,更要能够实现,能够应用!

4.3 算法的时间和空间复杂度的分析,进一步改进等

  本系统目前涉及到算法的地方不是很多,也不复杂。目前的搜索还是按照当前文件夹搜索第一级子文件的方式,复杂度为O(n)。后面扩展开发的情况下,可以在“查找文件”上做文章,选择一种比较高效的文件搜索模式,甚至建立本地索引数据库以提升速度等,都是有可能实现,同时需要复杂算法深究的地方。

4.4 总结

  这个项目,已基本完成了FileExplorer V2.0的开发。相比之前版本已经有了巨大进步。经过这近两周的上机实践和紧张开发当中,我收获良多。首先在知识应用上,有了很大的提高,其中也包含了我对swing,mvc,多线程,算法等的新认识。

  阶段性项目实训是一个非常有意义的一门课,与其他以讲授为主的课程,这门课非常讲求实践,只要愿意认真去做,可以很好很快的提升自己的能力水平。

About

基于 java swing 开发的资源管理器。使用 java swing 美化包beautyeye对原生的 java swing 优化。

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages