java swing jtree实现资源管理器 - 源码分享
时间:2018-11-14
本文章向大家介绍JTree实现电脑资源管理器 ,需要的朋友可以参考一下
0.前言
最近老师布置了一项用Java写资源管理器的任务,一开始以为简单,但是实际操作起来,却发现网上的资源用起来相对生疏。在使用中,我也遇到了许多问题,虽然不能像其他博主一样,写的非常齐全,但我还是分享一下我写的代码。
1.准备知识
- JTree是树形结构,是我们做资源管理器的必要组件。其构造函数的参数可以是节点,或者模式。
- JTree只有放在JScrollPane里,才可以很好的显示
- JTree是通过节点操作来实现多层目录的。
- 一般使用DefaultMutableTreeNode来实现节点,可以通过add()函数,添加至其他节点。
2.思路
一开始的思路是用DFS深搜,但是实现后发现,相当的慢。
所以,我就想先写一个“我的电脑”节点,然后往下加磁盘分区,然后当我点击一个节点的时候(用事件监听,这里用到TreeSelectionListener),再往下展开(添加节点)
3.代码
等我用空再添加,不要急啊。
4.全部代码
目前只做到了显示目录,关于操作节点还未实现。
1 import java.awt.*; 2 import java.io.File; 3 4 import javax.swing.*; 5 import javax.swing.event.TreeExpansionEvent; 6 import javax.swing.event.TreeExpansionListener; 7 import javax.swing.event.TreeModelEvent; 8 import javax.swing.event.TreeModelListener; 9 import javax.swing.event.TreeSelectionEvent; 10 import javax.swing.event.TreeSelectionListener; 11 import javax.swing.tree.*; 12 13 public class Src_manage extends JFrame 14 implements TreeSelectionListener { 15 private JTree tree = new JTree(); 16 private DefaultTreeModel treeModel; 17 private DefaultMutableTreeNode top; 18 19 public Src_manage() { 20 this.setLayout(new BorderLayout()); 21 this.add(createPC(), BorderLayout.CENTER); 22 this.add(createPW(), BorderLayout.WEST); 23 //设置窗体 24 this.setSize(550, 450); 25 this.setVisible(true); 26 this.setTitle("资源管理器"); 27 this.setResizable(false); // 设置不允许缩放 28 setLocationRelativeTo(null); // 窗口居中 29 setDefaultCloseOperation(EXIT_ON_CLOSE);// 窗口点击关闭时,退出程序 30 } 31 /** 32 * 设置左边文件列表 33 * @return 34 */ 35 public JPanel createPW() { 36 JPanel pw = new JPanel(); 37 //设置模式 38 top = new DefaultMutableTreeNode("我的电脑"); 39 treeModel = new DefaultTreeModel(top); 40 //设置树 41 tree = new JTree(treeModel); 42 tree.setEditable(true); 43 tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 44 tree.setShowsRootHandles(true); 45 //设置监听 46 tree.addTreeSelectionListener(this); 47 //设置节点 48 File roots[] = File.listRoots(); 49 for(int i=0; i<roots.length; i++) { 50 top.add(new DefaultMutableTreeNode(roots[i])); 51 } 52 53 //添加至面板 54 JScrollPane jsp = new JScrollPane(tree); 55 jsp.setPreferredSize(new Dimension(200, 405)); 56 pw.add(jsp); 57 58 return pw; 59 } 60 /** 61 * 设置右边文件显示 62 * @return 63 */ 64 public JPanel createPC() { 65 JPanel pc = new JPanel(); 66 return pc; 67 } 68 /** 69 * 创建节点 70 * @return 71 */ 72 public void createNode(File path, DefaultMutableTreeNode node) { 73 File childs[] = path.listFiles(); 74 for(int i=0; i<childs.length; i++) { 75 if(childs[i].isHidden()) 76 continue; 77 DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(childs[i].getName()); 78 treeModel.insertNodeInto(tmp, node, node.getChildCount()); 79 if(childs[i].isDirectory()) 80 tmp.add(new DefaultMutableTreeNode()); 81 } 82 } 83 /** 84 * 主函数 85 * @param args 86 */ 87 public static void main(String[] args) { 88 // TODO 自动生成的方法存根 89 new Src_manage(); 90 } 91 92 @Override 93 public void valueChanged(TreeSelectionEvent e) { 94 // TODO 自动生成的方法存根 95 //获取选择的节点 96 DefaultMutableTreeNode node = (DefaultMutableTreeNode) (e.getPath().getLastPathComponent()); 97 //若为根节点,跳出 98 if(node.isRoot()) 99 return; 100 //获取路径 101 TreeNode[] tp = node.getPath(); 102 String path = tp[1].toString(); 103 for(int i=2; i<tp.length; i++) { 104 path += tp[i] + "\\"; 105 } 106 //增加节点 107 createNode( new File(path), node); 108 } 109 }
- Leetcode-Easy 155. Min Stack
- Leetcode-Easy 72. Edit Distance
- React第三方组件4(状态管理之Reflux的使用③TodoList中)
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- i++和++i傻傻分不清楚?这里给你最清楚的解答
- android APT 使用
- Flutter异步编程async与await的基本使用
- 教大家一个万能PPT图片排版技巧,太赞了!
- 重复读取 HttpServletRequest 中 InputStream 的方法
- 测试面试题集锦(三)| 计算机网络和数据库篇(附答案)
- 关于Scikit-Learn你(也许)不知道的10件事
- 技术天地 | CSS-in-JS:一个充满争议的技术方案
- 安全研究 | 通过域名劫持实现Azure DevOps账户劫持
- 一款针对DLL劫持的恶意DLL生成器
- AuthMatrix:一款针对Web应用和服务的认证安全检测BurpSuite工具
- KITT-Lite:基于Python实现的轻量级命令行渗透测试工具集
- 一次KimSuky攻击事件分析
- OpenCV中如何使用滚动条动态调整参数
- 一文读懂「分布式架构」