Java Swing文件分类系统开发全记录
个人文件分类管理系统设计与开发实录从零开始打造一个Java Swing桌面应用的全过程记录前言作为一名Java学习者在完成基础知识的学习后我一直想动手做一个完整的小项目来巩固所学。刚好借Java课程设计要求完成一个项目的契机经过反复思考我决定开发一个个人文件分类管理系统——这是一个贴近日常需求、功能相对完整、又能充分运用面向对象思想和数据库操作的项目。本文将完整记录这个项目的从需求分析、系统设计到编码实现的全部过程希望能给同样在学习Java的同学们一些参考。一、项目概述1.1 项目背景在日常使用电脑的过程中我们总会积累大量的文件文档、图片、视频、代码……时间久了文件散落在各个角落找起来费时费力。虽然Windows系统本身提供了搜索功能但对于分类管理、批量操作、软删除恢复等需求原生系统就显得力不从心了。1.2 项目目标开发一个简洁易用的桌面应用程序实现以下核心功能分类管理以树形结构组织文件分类支持多级目录文件导入批量扫描文件夹智能识别文件类型并归类软删除机制支持误删恢复避免数据丢失右键菜单提供文件重命名、移动分类、删除等快捷操作回收站功能查看已删除文件可选择恢复或彻底删除1.3 技术选型类别技术说明语言Java 17使用最新的LTS版本GUISwingJava原生桌面开发库数据库MySQL 8.0关系型数据库存储元数据构建工具Maven依赖管理和项目构建架构模式MVC模型-视图-控制器分离二、系统分析2.1 功能需求核心功能模块┌─────────────────────────────────────────────────────────┐ │ 文件分类管理 │ ├─────────────────────────────────────────────────────────┤ │ ✓ 分类树展示左侧面板 │ │ ✓ 新增/编辑/删除分类 │ │ ✓ 分类拖拽排序 │ │ ✓ 文件计数显示 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 文件浏览 │ ├─────────────────────────────────────────────────────────┤ │ ✓ 文件列表展示右侧面板JTable实现 │ │ ✓ 显示文件名、大小、类型、所属分类 │ │ ✓ 双击打开文件 │ │ ✓ 排序功能按名称/大小/时间 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 文件操作 │ ├─────────────────────────────────────────────────────────┤ │ ✓ 批量导入文件夹 │ │ ✓ 文件重命名 │ │ ✓ 文件移动到其他分类 │ │ ✓ 文件软删除移入回收站 │ │ ✓ 文件彻底删除 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ 回收站 │ ├─────────────────────────────────────────────────────────┤ │ ✓ 查看已删除文件 │ │ ✓ 恢复文件 │ │ ✓ 清空回收站 │ └─────────────────────────────────────────────────────────┘2.2 用例分析主要参与者普通用户使用系统进行日常文件管理核心用例浏览分类树查看文件列表导入文件到分类重命名文件移动文件到其他分类删除文件软删除恢复已删除文件彻底删除文件管理分类增删改2.3 非功能性需求易用性界面简洁操作直观符合Windows操作习惯稳定性异常操作有合理提示不轻易崩溃性能千级文件秒级响应可扩展性预留接口便于后续功能扩展三、系统设计3.1 总体架构采用经典的MVCModel-View-Controller架构┌────────────────────────────────────────────────────────────┐ │ View 层 │ │ (FileManagerApp.java) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ JTree │ │ JTable │ │ JMenuBar │ │ │ │ (分类树) │ │ (文件列表) │ │ (菜单栏) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────┐ │ Controller 层 │ │ (FileService.java) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 文件导入 │ │ 文件重命名 │ │ 文件移动 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────┐ │ Model 层 │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ DatabaseManager │ │ Models │ │ │ │ (数据访问) │ │ (数据模型) │ │ │ └──────────────────┘ └──────────────────┘ │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────┐ │ MySQL 数据库 │ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │ │categories│ │ files │ │import_records│ │ │ └──────────┘ └──────────┘ └──────────────┘ │ └────────────────────────────────────────────────────────────┘3.2 类图设计核心类及其关系┌─────────────────────────────────────────────────────────────┐ │ FileManagerApp (主窗口) │ │─────────────────────────────────────────────────────────────│ │ - DEFAULT_LIST_MODEL: DefaultListModel │ │ - treeModel: DefaultTreeModel │ │ - categoryTree: JTree │ │ - fileTable: JTable │ │─────────────────────────────────────────────────────────────│ │ main() │ │ createUI() │ │ initDatabase() │ │ updateCategoryTree() │ │ updateFileTable() │ │ showRightClickMenu() │ └─────────────────────────────────────────────────────────────┘ │ │ 使用 ▼ ┌───────────────────────┐ ┌───────────────────────┐ │ FileService │ │ DatabaseManager │ │───────────────────────│ │───────────────────────│ │ importFiles() │◄────│ initializeDatabase()│ │ renameFile() │ │ getAllCategories() │ │ moveFile() │ │ insertFile() │ │ batchSoftDelete() │ │ updateFile() │ │ permanentlyDelete() │ │ softDeleteFile() │ └───────────────────────┘ │ restoreFile() │ │ permanentlyDelete() │ └───────────────────────┘ │ │ 使用 ▼ ┌───────────────────────┐ │ DBUtil │ │───────────────────────│ │ getConnection() │ └───────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ Models (数据模型) │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Category │ │ FileInfo │ │ImportRecord │ │ │ ├─────────────┤ ├─────────────┤ ├─────────────┤ │ │ │ id: int │ │ id: int │ │ id: int │ │ │ │ name: String│ │ filePath │ │ filePath │ │ │ │ parentId │ │ fileName │ │ importedAt │ │ │ │ fileCount │ │ fileSize │ └─────────────┘ │ │ └─────────────┘ │ categoryId │ │ │ │ isDeleted │ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────────┘3.3 时序图文件导入流程用户 FileManagerApp FileService DatabaseManager MySQL │ │ │ │ │ │ 点击导入按钮 │ │ │ │ │──────────────────────►│ │ │ │ │ │ │ │ │ │ │ 选择文件夹 │ │ │ │◄─────────────────────│ │ │ │ │ │ │ │ │ │ │ 调用importFiles() │ │ │ │ │──────────────────►│ │ │ │ │ │ │ │ │ │ │ 扫描文件夹 │ │ │ │ │───────────────────│ │ │ │ │◄───────────────────│ │ │ │ │ │ │ │ │ │ 逐个插入文件记录 │ │ │ │ │──────────────────►│ │ │ │ │◄──────────────────│ │ │ │ │ │ │ │ │ 更新UI (SwingWorker)│ │ │ │ │◄──────────────────│ │ │ │ │ │ │ │ │ 显示进度 │ │ │ │ │◄─────────────────────│ │ │ │软删除流程用户 FileManagerApp DatabaseManager MySQL │ │ │ │ │ 右键删除文件 │ │ │ │──────────────────────►│ │ │ │ │ │ │ │ │ softDeleteFile() │ │ │ │──────────────────►│ │ │ │ │ │ │ │ │ UPDATE files │ │ │ │ SET is_deleted1 │ │ │ │─────────────────►│ │ │ │◄────────────────│ │ │ │ │ │ │ 刷新文件列表 │ │ │ │◄──────────────────│ │ │ │ │ │ │ 删除成功提示 │ │ │ │◄─────────────────────│ │ │四、数据库设计4.1 ER图┌─────────────────┐ ┌─────────────────┐ │ categories │ │ files │ │─────────────────│ 1 N │─────────────────│ │ PK id │─┐ ┌─►│ PK id │ │ name │ │ │ │ file_path │ │ parent_id │─┴───┘ │ file_name │ │ is_deleted │ │ file_size │ │ created_at │ │ FK category_id │ └─────────────────┘ │ is_deleted │ │ deleted_at │ │ created_at │ └─────────────────┘ │ │ 1 N ▼ ┌─────────────────┐ │import_records │ │─────────────────│ │ PK id │ │ file_path │ │ imported_at │ └─────────────────┘4.2 表结构1. 分类表 (categories)字段名数据类型约束默认值说明idINTPRIMARY KEY, AUTO_INCREMENT-分类IDnameVARCHAR(100)NOT NULL-分类名称parent_idINTFOREIGN KEYNULL父分类ID自引用is_deletedTINYINT(1)-0软删除标记created_atTIMESTAMP-CURRENT_TIMESTAMP创建时间2. 文件表 (files)字段名数据类型约束默认值说明idINTPRIMARY KEY, AUTO_INCREMENT-文件IDfile_pathVARCHAR(500)NOT NULL, UNIQUE-文件绝对路径file_nameVARCHAR(255)NOT NULL-文件名file_sizeBIGINT-0文件大小字节category_idINTFOREIGN KEYNULL所属分类IDis_deletedTINYINT(1)-0软删除标记deleted_atTIMESTAMP-NULL删除时间created_atTIMESTAMP-CURRENT_TIMESTAMP导入时间3. 导入记录表 (import_records)字段名数据类型约束默认值说明idINTPRIMARY KEY, AUTO_INCREMENT-记录IDfile_pathVARCHAR(500)NOT NULL-导入的文件夹路径imported_atTIMESTAMP-CURRENT_TIMESTAMP导入时间五、核心功能实现5.1 软删除机制软删除是本项目的核心特色之一。通过在数据库中添加is_deleted字段实现了回收站功能/** * 软删除文件移入回收站 */publicbooleansoftDeleteFile(intfileId){StringsqlUPDATE files SET is_deleted 1, deleted_at NOW() WHERE id ?;try(PreparedStatementpsconnection.prepareStatement(sql)){ps.setInt(1,fileId);returnps.executeUpdate()0;}catch(SQLExceptione){e.printStackTrace();returnfalse;}}/** * 恢复文件从回收站还原 */publicbooleanrestoreFile(intfileId){StringsqlUPDATE files SET is_deleted 0, deleted_at NULL WHERE id ?;try(PreparedStatementpsconnection.prepareStatement(sql)){ps.setInt(1,fileId);returnps.executeUpdate()0;}catch(SQLExceptione){e.printStackTrace();returnfalse;}}/** * 彻底删除文件从数据库和磁盘同时删除 */publicbooleanpermanentlyDeleteFile(intfileId){// 1. 获取文件路径FileInfofilegetFileById(fileId);if(filenull)returnfalse;// 2. 删除磁盘文件FilediskFilenewFile(file.getFilePath());if(diskFile.exists()){diskFile.delete();}// 3. 删除数据库记录StringsqlDELETE FROM files WHERE id ?;try(PreparedStatementpsconnection.prepareStatement(sql)){ps.setInt(1,fileId);returnps.executeUpdate()0;}catch(SQLExceptione){e.printStackTrace();returnfalse;}}设计亮点is_deleted 0正常文件is_deleted 1已删除回收站软删除保留了元数据支持恢复彻底删除时才真正从磁盘移除文件5.2 树形分类结构使用 JTree 组件展示分类的层级关系/** * 初始化分类树 */privatevoidinitCategoryTree(){ListCategorycategoriesdbManager.getAllCategories();DefaultMutableTreeNoderootnewDefaultMutableTreeNode(全部分类);// 构建树形结构MapInteger,DefaultMutableTreeNodenodeMapnewHashMap();for(Categoryc:categories){DefaultMutableTreeNodenodenewDefaultMutableTreeNode(c);nodeMap.put(c.getId(),node);}// 建立父子关系for(Categoryc:categories){DefaultMutableTreeNodenodenodeMap.get(c.getId());if(c.getParentId()null){root.add(node);}else{DefaultMutableTreeNodeparentnodeMap.get(c.getParentId());if(parent!null){parent.add(node);}}}categoryTreenewJTree(root);categoryTree.addTreeSelectionListener(e-{// 选中节点时更新文件列表updateFileTable();});}数据库设计技巧使用parent_id自引用实现树形结构NULL表示顶级分类递归查询构建完整树5.3 异步文件导入使用 SwingWorker 实现后台导入避免UI卡顿/** * 批量导入文件异步执行 */privatevoidimportFiles(Filefolder){SwingWorkerInteger,IntegerworkernewSwingWorker(){privateintcount0;OverrideprotectedIntegerdoInBackground(){File[]filesfolder.listFiles();if(filesnull)return0;for(Filefile:files){if(file.isFile()){// 获取文件信息Stringpathfile.getAbsolutePath();Stringnamefile.getName();longsizefile.length();intcategoryIdguessCategory(name);// 智能分类// 存入数据库dbManager.insertFile(path,name,size,categoryId);count;publish(count);// 更新进度}}returncount;}Overrideprotectedvoidprocess(ListIntegerchunks){// 在EDT线程更新进度条progressBar.setValue(chunks.get(chunks.size()-1));}Overrideprotectedvoiddone(){try{JOptionPane.showMessageDialog(FileManagerApp.this,导入完成共导入 get() 个文件);}catch(Exceptione){e.printStackTrace();}}};worker.execute();}技术要点doInBackground()后台线程执行耗时操作publish()/process()进度更新到UIdone()任务完成后在EDT执行收尾工作六、项目结构PersonalFileManagerSystem/ ├── pom.xml # Maven配置文件 ├── init_database.sql # 数据库初始化脚本 ├── README.md # 项目说明文档 └── src/ └── main/ └── java/ └── com/ └── filemanager/ ├── FileManagerApp.java # 主窗口View Controller ├── FileService.java # 文件操作服务 ├── DatabaseManager.java # 数据库访问层 ├── DBUtil.java # 数据库连接工具 └── Models.java # 数据模型类七、关键代码清单编号功能出处1主窗口初始化与布局FileManagerApp.java2分类树JTree构建FileManagerApp.java (initCategoryTree)3文件列表JTable展示FileManagerApp.java (updateFileTable)4右键菜单实现FileManagerApp.java (showPopupMenu)5数据库连接DBUtil.java (getConnection)6软删除DatabaseManager.java (softDeleteFile)7恢复文件DatabaseManager.java (restoreFile)8彻底删除DatabaseManager.java (permanentlyDeleteFile)9批量导入文件FileService.java (importFiles)10文件重命名FileService.java (renameFile)八、项目成品页面展示5.1系统界面整体展示5.2导入功能展示5.3重命名功能展示5.4回收站页面展示5.5文件删除恢复功能展示九、总结与展望9.1 项目收获通过这个项目的开发我收获颇丰理论与实践结合将Java SE、JDBC、Swing等知识串联起来形成完整的技术体系工程化思维学会使用Maven管理项目结构规范代码组织数据库设计掌握了ER图绘制、表结构设计、外键关联等技能GUI开发经验熟悉了Swing的事件处理、线程模型、组件布局问题解决能力从环境配置到功能调试积累了大量实战经验9.2 存在的不足界面美化程度有限Swing原生组件颜值一般缺少搜索过滤功能没有实现文件预览分类管理功能较为简单9.3 改进方向如果后续继续优化可以考虑使用 JavaFX 替代 Swing获得更现代的UI添加文件搜索、标签管理功能实现文件预览图片缩略图、视频时长等添加数据导出/导入功能使用设计模式重构代码如工厂模式、策略模式结语一个看似简单的文件管理工具背后涉及到的知识点却不少。从数据库设计到GUI开发从同步编程到异步处理每个环节都需要认真思考和实践。希望这篇博客能够给正在学习Java或准备做课程设计的同学一些帮助。如果有任何问题欢迎交流讨论项目源码已开源如有需要可联系作者获取。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2512529.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!