JTree实现文件树
来源:互联网 发布:2016年上半年出口数据 编辑:程序博客网 时间:2024/05/16 06:11
这篇文章介绍的内容其实跟TWaver的组件没有任何关系,但是个人觉得还是挺有意思的,所以发出来共享一下。这个文件树(如下图)完全基于swing的JTree组件实现,先看一下最后我们完成的效果:
运行截图:
功能介绍:
- 树状呈现文件系统结构
- 文件的图标应该使用系统图标
- 鼠标滑过时改变当前节点的背景色(如图中"Windows"节点的砖红色背景)
- FileTreeTest 程序入口
- FileTree 文件树,从JTree继承
- FileNode 封装的文件节点,包括文件名,文件图标和实际的File类及其它标识
- FileTreeRenderer 定制的节点渲染器,从DefaultTreeCellRenderer继承
- FileTreeModel 定制的TreeModel,从DefaultTreeModel继承
考虑到系统文件会很多,在程序开始就初始化整个树是不现实的,所以我采取一种延迟加载的策略,只有当要展开某个节点的时候,才去初始化它的子节点,在FileTree的构造里加一个监听:
addTreeWillExpandListener(new TreeWillExpandListener() { @Override public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { DefaultMutableTreeNode lastTreeNode =(DefaultMutableTreeNode) event.getPath().getLastPathComponent(); FileNode fileNode = (FileNode) lastTreeNode.getUserObject(); if (!fileNode.isInit) { File[] files; if (fileNode.isDummyRoot) { files = fileSystemView.getRoots(); } else { files = fileSystemView.getFiles( ((FileNode) lastTreeNode.getUserObject()).file, false); } for (int i = 0; i < files.length; i++) { //文件名和图标都是通过fileSystemView得到 FileNode childFileNode = new FileNode( fileSystemView.getSystemDisplayName(files[i]), fileSystemView.getSystemIcon(files[i]), files[i], false); DefaultMutableTreeNode childTreeNode = new DefaultMutableTreeNode(childFileNode); lastTreeNode.add(childTreeNode); } //通知模型节点发生变化 DefaultTreeModel treeModel1 = (DefaultTreeModel) getModel(); treeModel1.nodeStructureChanged(lastTreeNode); } //更改标识,避免重复加载 fileNode.isInit = true; } @Override public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { } });
当然这种方式需要TableModel的配合,我重载了DefaultTreeModel,在构造里初始化根节点,然后重载isLeaf方法,具体代码可以下载附件查看。
接下来思考一下鼠标滑过改变背景色怎么实现。
写这段代码的时候,我想起来了我刚学Renderer的时候的一个错误的认识:误以为每个节点都有一个Renderer并且妄图在Renderer上加监听!在此强调一下:Renderer只是一个渲染器,要显示节点的时候,JTree就调用它渲染并画到屏幕上,但是无论有多少节点,一个JTree只有一个Renderer!
Renderer上加监听行不通,我们就转换一下思路,在JTree上加鼠标move监听,然后repaint鼠标所在的节点。
需要在JTree中保存鼠标滑过的TreePath(mouseInPath),这样在Renderer中才可以改变mouseInPath的背景色
FileTree fileTree=(FileTree)tree; JLabel label= (JLabel) super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus); DefaultMutableTreeNode node=(DefaultMutableTreeNode)value; FileNode fileNode=(FileNode)node.getUserObject(); label.setText(fileNode.name); label.setIcon(fileNode.icon); label.setOpaque(false);//如果当前渲染的节点就是鼠标滑过的节点,改变背景色 if(fileTree.mouseInPath!=null&& fileTree.mouseInPath.getLastPathComponent().equals(value)){ label.setOpaque(true); label.setBackground(new Color(255,0,0,90)); } return label;
至此这个文件树就写完了!全部代码在附件,有兴趣的同学可以下载看看,也希望看过的同学有好的想法来交流一下。 附件:见原文最下方
- JTree实现文件树
- JTree实现的系统文件目录树
- JTree实现的系统文件目录树
- JTree实现文件树——使用系统图标
- Jtree生成系统文件树
- jTree打造硬盘文件目录树
- JTree文件树相关操作--学习推荐
- JTree树转存为xml文件
- JTree实现资源管理器,过滤文件和动态监听
- 用JTree类实现日历
- JTree--树(基本使用)
- jtree
- JTree
- JTree
- JTree
- JTree
- JTree
- JTree
- 元芳,这个Bug你怎么看
- 位图文件(BMP)格式以及Linux下C程序实现
- speex源码分析-4-固定码本激励
- 如何看懂源代码--(分析源代码方法)
- OCX开发与第三方OCX封装
- JTree实现文件树
- java调用diff命令
- MySQL存储 BLOB 类型数据
- Android开发(2) 在Eclipse下搭建Android开发环境
- J2ME资料汇 48个推荐资料+40个经典源码
- 2012-11-2 11gR2 "ADMINISTRATOR'S GUIDE" page 551 - 584
- c++内存管理
- java读取config.ini
- 在没有打印以及ICE无法连接的情况下,如何知道kernel hang的位置