- 浏览: 160595 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qq_21380041:
954414957@qq.com
HTML5数据可视化第二弹:打造最美3D机房 -
qq_21380041:
楼主,求代码
HTML5数据可视化第二弹:打造最美3D机房 -
luoaz:
楼主能不能传个源码的附件上来, 分享学习下呢?
HTML5+WebGL 3D机房开发实例 -
xiaosi1278:
你好能不能把你讲的源代码发一下!!做参考403541110@q ...
TWaver 3D 编辑器的使用(一)----设计3D场景以及数据绑定 -
TWaverGeek:
BigBird2012 写道您好,您能把您使用TWaver导入 ...
TWaver导入导出AutoCAD DXF图纸
这篇文章介绍的内容其实跟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鼠标所在的节点。
addMouseMotionListener(new MouseAdapter() { @Override public void mouseMoved(MouseEvent e) { //获得鼠标所在的TreePath TreePath path=getPathForLocation(e.getX(), e.getY()); //计算repaint的区域并repaint JTree if(path!=null){ if(mouseInPath!=null){ Rectangle oldRect=getPathBounds(mouseInPath); mouseInPath=path; repaint(getPathBounds(path).union(oldRect)); }else{ mouseInPath=path; Rectangle bounds=getPathBounds(mouseInPath); repaint(bounds); } }else if(mouseInPath!=null){ Rectangle oldRect=getPathBounds(mouseInPath); mouseInPath=null; repaint(oldRect); } } });
需要在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;
至此这个文件树就写完了!全部代码在附件,有兴趣的同学可以下载看看,也希望看过的同学有好的想法来交流一下。
附件:见原文最下方
发表评论
-
数字图像处理技术在TWaver可视化中的应用
2015-04-16 14:30 676数字图像处理(Digital Image Processin ... -
TWaver HTML5之树形布局
2015-03-11 10:53 1364转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没 ... -
TWaver推智能手表挑战华为苹果
2015-03-04 10:35 5722015年的春节刚过,苹果、华为、三星就紧锣密鼓的发布了各自 ... -
TWaver矢量小试——Android演进路线图
2015-02-02 11:56 1184还有半个多月就到春节了,年底相信很多公司都会进行年度总结以及 ... -
用TWaver加载大型游戏场景一例
2015-01-06 13:52 696游戏中经常会出现一些大型的户外场景,例如一个小镇、一座古城等 ... -
22万个木箱!TWaver 3D极限压榨
2014-12-29 11:31 851打开个门户网站都千呼万唤,我们还能期待网页上的3D技术会有 ... -
巧用TWaver 3D 矢量图形功能
2014-10-29 11:14 557的确,提起TWaver,大家想到的首先是“电信拓扑图组件”。 ... -
TWaver GIS在电信中的使用
2014-10-09 14:56 510GIS作为信息系统的重要组成部分,在电信行业中的应用由来已久。 ... -
如何创建环型、树型双层布局
2014-09-19 10:58 787TWaver的Demo中有常用的环型布局和树型布局,但是当网 ... -
如何创建发光的环路
2014-09-16 13:44 734先看看发光链路的运行效果:在这个Demo中主要包含三个技术 ... -
Autolayout性能优化
2014-09-03 11:05 942客户的需求就是我们进步的动力。最近有客户提出大数据量Top ... -
DNA分子结构3D模型
2014-08-21 15:16 839生物信息资源更新越来 ... -
TWaver版3D化学元素周期表
2014-07-14 10:17 1670很早就有人做3D网页版的化学元素周期表了,酷炫效果和新鲜技巧 ... -
在MONO Design中使用Flex3D
2014-07-08 10:04 638在项目开发组的努力下,HTML5 3D 的开发包变得越来越优 ... -
TWaver 3D技术在油田行业的应用
2014-05-26 15:29 626油田信息化是是数字油 ... -
用TWaver实现组合的Chart
2013-01-21 12:14 1375TWaver组件中提供了一些通用的Chart,比如Line ... -
TWaver Java内存占用测试
2012-12-25 13:50 800TWaver Java的性能大家有 ... -
TWaver With JavaFX
2012-10-10 18:08 769JavaFX Script被抛弃以后,很久不关心JavaFX了 ... -
如何让HTML5的表格支持后台排序与分页
2012-08-21 17:41 1335TWaver HTML5发布已有一段时间,使用的客户也是逐渐增 ... -
自定义Background
2012-08-17 12:08 916TWaver提供了ImageBackground来为TNetw ...
相关推荐
jtree目录树,学习目录树的同学可以参考参考,js实现的,可以动态的无限添加目录树节点,非常方便
(十) JAVA swing编程JTree实现系统目录 77 FileTree1.java源代码 77 (十一) Java Swing中的JTree模型 85 Swing.tree包中的主要类名称实现 85 1. 构建树模型 86 2. 树结点 86 树结构详细类图 86 2.1 TreeNode接口 86 ...
java swing tree树的懒加载, 下载文件导入eclipse可直接运行。
该项目的目标是提供具有文件系统目录层次结构的Java Swing JTree模型的高效且便捷的实现(例如,用于目录选择器组件)。 提供了一个演示应用程序。 参见org.swingk.io.dirtree.demo.Demo 。 该库被打包为Java 9...
编译原理课程设计--C-minus词法和语法分析器,用lex做的词法分析,包含输入文件;LL(1)语法分析;JTree输出分析树
把File对象也放该函数内,以使引用FileIO对象的类更整洁,因为每次文件目录树收起时也触发valueChanged函数,所以此处加if判断是否是收起操作。该判断条件来源与打印((JTree) e.getSource()).getSelectionPath()调试...
把File对象也放该函数内,以使引用FileIO对象的类更整洁,因为每次文件目录树收起时也触发valueChanged函数,所以此处加if判断是否是收起操作。该判断条件来源与打印((JTree) e.getSource()).getSelectionPath()调试...
本文本编辑器的开发主要包括界面窗口的菜单栏和工具栏以及树结构,还有链接Java虚拟机实现编译与运行。使用SUN公司的Java中的GUI作为开发技术,利用其提供的各种类与接口,首先建立系统应用原型。 本文本编辑器的...
里面包含了:java窗口的构架设计,JFileChooser、文件过滤器、JTextArea、JScrollPane、JTree、JMenuBar、用JTimer自动执行任务,及最让人头痛的文件存储操作数据等。 功能:1、选择一般文档(txt、java等普通格式...
2.编写其它文件时要重命名,双击树目录或标签即可命名 3.基本功能均实现,只是编辑区的排版有点乱,正是下一步要做的,现在是预览版,如有需要请期待,Mains为主文件,需添加tools.jar,编辑即可运行
FileList.java 自己实现的一个文件名称枚举类 MyDataIO.java 数据输入输出示例 MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java 管道流示例 MySequenceIn.java 顺序输入流示例 ObjectFileTest....
学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...
7.2.3 类与源代码文件的搭配 106 7.3 成员的访问控制 107 7.3.1 公共类型 107 7.3.2 私有类型 108 7.3.3 默认类型 109 7.3.4 保护类型 109 7.3.5 Java中封装的实现 110 7.4 final的变量 112 7.4.1 ...
14.8.10树(JTree)使用示例518 14.8.11菜单使用示例523 14.9布局管理527 14.9.1流式布局(FlowLayout)回顾527 14.9.2边框布局(BorderLayout)使用示例528 14.9.3网格布局(GridLayout)使用示例529 14.9.4...
13.3.7 树(JTree) 13.3.8 文本框(JTextField)与文本区(JTextArea) 13.4 布局管理器 13.4.1 FlowLayout布局管理器 13.4.2 BorderLayout布局管理器 13.4.3 BoxLayout布局管理器 13.4.4 GridLayout布局管理器 ...