- 浏览: 372789 次
- 性别:
- 来自: 上海
最新评论
-
heshifk:
我今天用这个也遇到了一个问题,当焦点在别的组件上面,也添加了快 ...
SWT 添加全局的监听 -
回归蔚蓝:
好文,归纳的太准确了
Groovy闭包深入学习 -
零度弥合:
写的真好,赞赞赞。
Groovy闭包深入学习 -
yuxg:
顶
Java在Eclipse环境下调用Subclipse接口完成SVN操作(附源码) -
zk1878:
不错,好文
Groovy闭包深入学习
为了实现这样的效果:
载入的过程中,显示Pending。
载入完毕,Pending消失。
我们先从基础的说起,先来看ITreeContentProvider 接口:
getElements 表示在setInput(Object)的时候,如何从Object中得到一个数组,而使用这个数组去将树的第一层结点显示出来。这个方法只在setInput时才使用一次。
getChildren表示在每次展开树的节点时,如果得到下一级节点的值,当然,树的节点展开了一次就不会再调用这个方法了,因为在树节点对应的控件TreeItem中,已经创建好了子节点控件了。
hasChildren就是判断当前节点是否有子节点,有的话,就显示+号。
ITreeContentProvider的使用类型可以分成3种(我自己分的,^-^)。
1。简单模式
2。Lazy Loader模式(简单)
3。Lazy Loader模式(显示Pending)
一. 简单模式
其实就是在setInput的模型中,已经预先将所有的子模型都载入完毕,而不用再动态的载入子模型了。
模型说明:
这个模型代表树节点,是支持父子结构的。当然,在Jface里面是有一个TreeNode的,org.eclipse.jface.viewers.TreeNode,相应的还提供了一个org.eclipse.jface.viewers.TreeNodeContentProvider。
ContentProvider代码:
构建setInput的模型
就是在构建模型的时候,将所有的子模型都加载好了:
其他代码:
二. Lazy Load模式(简单)
在setInput的模型中,只有最顶层的模型,再每次点击+的时间,将下一层的模型动态的载入,从而将树的子节点构造出来。也就是在getChildren中动态载入即可。
ContentProvider代码。
注意getChildren 和hasChildren的方法实现,hasChildren返回true,表示需要给这个树节点显示+号。点击+号,getChildren会动态的载入子节点数据,这样就实现了Lazy Load了。
构建setInput的模型:
只需要构建第一层树节点即可,后面的就交给ContentProvider去处理。
其他代码:
三. Lazy Loader模式(显示Pending)
和模式是二一样的,都是点+载入子模型。但是,如果是需要长时间的加载,模式二会将界面卡住,而这个模式,再点击+号后,会先显示一个Pending树节点(并可以显示进度条),并看到随着数据一个一个载入树节点一个一个添加出来,所有数据都载入后,Pending树节点消失,这样用户体验就会好很多。在这个模式,需要用到很多其他的类,具体看代码:
模型代码:
1. 需要实现IDeferredWorkbenchAdapter接口。
2. 注意fetchDeferredChildren方法。将载入子数据的过程放到了模型里面(很怪)。
ContentProvider代码。
1. 添加了一个DeferredTreeContentManager,并使用该manager代理getChildren方法。
2. hasChildren返回true。
3. 修改了getElements方法。
LabelProvider代码:
1. 修改了getText方法。由于我们说中间会创建一个显示Pending的节点,这个节点就是PendingUpdateAdapter,需要特别指定显示的text。
构建setInput的模型:
1. 只需要预先放入根节点即可。子节点的载入就依赖于点击+号,lazy载入了。
其他代码:
四. 总结
1. 简单模式适合于你一次性将数据全部载入,而后在setInput一次显示出来。
2. Lazy Load模式(简单)适合于性能影响不大的点击+号Lazy的载入数据。
3. Lazy Load模式(显示Pending)适合于载入过程比较长,为了提供用户交互而使用
4. Lazy Load模式都存在着遍历的问题。因为有的模型的子节点还没有完全载入,而你却依赖所有这些子节点的时候,这时就必须在代码里面将所有子节点打开,让其载入所有子数据至最后一层,对于(简单)和(显示Pending)都可以这么去做。
5. 还是4的情况,由于(显示Pending)是异步载入的,需要更复杂的判断,并基于线程去判断某节点是否载入完毕,等你自己去实现的时候,你会发现这是有多复杂的^-^
五. 其他相关的类
org.eclipse.jface.viewers.TreeNode
org.eclipse.jface.viewers.TreeNodeContentProvider
org.eclipse.jface.viewers.ArrayContentProvider
org.eclipse.ui.progress.IDeferredWorkbenchAdapter
org.eclipse.ui.progress.DeferredTreeContentManager
载入的过程中,显示Pending。
载入完毕,Pending消失。
我们先从基础的说起,先来看ITreeContentProvider 接口:
public interface ITreeContentProvider { public Object[] getElements(Object inputElement) ; public Object[] getChildren(Object parentElement) ; public boolean hasChildren(Object element) ; // ... }
getElements 表示在setInput(Object)的时候,如何从Object中得到一个数组,而使用这个数组去将树的第一层结点显示出来。这个方法只在setInput时才使用一次。
getChildren表示在每次展开树的节点时,如果得到下一级节点的值,当然,树的节点展开了一次就不会再调用这个方法了,因为在树节点对应的控件TreeItem中,已经创建好了子节点控件了。
hasChildren就是判断当前节点是否有子节点,有的话,就显示+号。
ITreeContentProvider的使用类型可以分成3种(我自己分的,^-^)。
1。简单模式
2。Lazy Loader模式(简单)
3。Lazy Loader模式(显示Pending)
一. 简单模式
其实就是在setInput的模型中,已经预先将所有的子模型都载入完毕,而不用再动态的载入子模型了。
模型说明:
这个模型代表树节点,是支持父子结构的。当然,在Jface里面是有一个TreeNode的,org.eclipse.jface.viewers.TreeNode,相应的还提供了一个org.eclipse.jface.viewers.TreeNodeContentProvider。
public class TreeNode { private TreeNode parent; private List<TreeNode> children = new ArrayList<TreeNode>(); private Object value;
ContentProvider代码:
public class SimpleContentProvider implements ITreeContentProvider { public Object[] getElements(Object inputElement) { return ((TreeNode) inputElement).getChildren().toArray(); } public Object[] getChildren(Object parentElement) { return ((TreeNode) parentElement).getChildren().toArray(); } public boolean hasChildren(Object element) { return ((TreeNode) element).getChildren().size() > 0; }
构建setInput的模型
就是在构建模型的时候,将所有的子模型都加载好了:
private TreeNode buildLazyContent() { TreeNode root = new TreeNode(null); TreeNode level_1_1 = new TreeNode("1.1"); root.addChild(level_1_1); // ... return root; }
其他代码:
viewer.setLabelProvider(new TreeViewerLabelProvider()); viewer.setContentProvider(new SimpleContentProvider()); viewer.setInput(this.buildSimpleContent());
二. Lazy Load模式(简单)
在setInput的模型中,只有最顶层的模型,再每次点击+的时间,将下一层的模型动态的载入,从而将树的子节点构造出来。也就是在getChildren中动态载入即可。
ContentProvider代码。
注意getChildren 和hasChildren的方法实现,hasChildren返回true,表示需要给这个树节点显示+号。点击+号,getChildren会动态的载入子节点数据,这样就实现了Lazy Load了。
public class SimpleLazyContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { TreeNode parent = (TreeNode) parentElement; this.loadChildren(parent); return parent.getChildren().toArray(); } public boolean hasChildren(Object element) { return true; } private void loadChildren(TreeNode parent) { TreeNode child_1 = new TreeNode("1"); parent.addChild(child_1); TreeNode child_2 = new TreeNode("2"); parent.addChild(child_2); }
构建setInput的模型:
只需要构建第一层树节点即可,后面的就交给ContentProvider去处理。
private TreeNode buildSimpleLazyContent() { TreeNode root = new TreeNode(null); TreeNode level_1_1 = new TreeNode("1.1"); root.addChild(level_1_1); return root; }
其他代码:
viewer.setLabelProvider(new TreeViewerLabelProvider()); viewer.setContentProvider(new SimpleLazyContentProvider()); viewer.setInput(this.buildSimpleLazyContent());
三. Lazy Loader模式(显示Pending)
和模式是二一样的,都是点+载入子模型。但是,如果是需要长时间的加载,模式二会将界面卡住,而这个模式,再点击+号后,会先显示一个Pending树节点(并可以显示进度条),并看到随着数据一个一个载入树节点一个一个添加出来,所有数据都载入后,Pending树节点消失,这样用户体验就会好很多。在这个模式,需要用到很多其他的类,具体看代码:
模型代码:
1. 需要实现IDeferredWorkbenchAdapter接口。
2. 注意fetchDeferredChildren方法。将载入子数据的过程放到了模型里面(很怪)。
public class PendingTreeNode extends TreeNode implements IDeferredWorkbenchAdapter { public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) { PendingTreeNode parent = (PendingTreeNode) object; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } PendingTreeNode node1 = new PendingTreeNode("1"); parent.addChild(node1); collector.add(node1, monitor); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } PendingTreeNode node2 = new PendingTreeNode("2"); parent.addChild(node2); collector.add(node2, monitor); }
ContentProvider代码。
1. 添加了一个DeferredTreeContentManager,并使用该manager代理getChildren方法。
2. hasChildren返回true。
3. 修改了getElements方法。
public class PendingLazyContentProvider implements ITreeContentProvider { private DeferredTreeContentManager manager; public Object[] getChildren(Object parentElement) { return manager.getChildren(parentElement); } public boolean hasChildren(Object element) { return true; } public Object[] getElements(Object inputElement) { if (inputElement instanceof PendingTreeNode) { return ((PendingTreeNode) inputElement).getChildren().toArray(); } return new Object[0]; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (manager == null) { manager = new DeferredTreeContentManager(this, (TreeViewer) viewer); } } }
LabelProvider代码:
1. 修改了getText方法。由于我们说中间会创建一个显示Pending的节点,这个节点就是PendingUpdateAdapter,需要特别指定显示的text。
public class PendingTreeViewerLabelProvider extends LabelProvider { public String getText(Object obj) { if (obj instanceof TreeNode) { return ((TreeNode) obj).getValue().toString(); } else if (obj instanceof PendingUpdateAdapter) { return ((PendingUpdateAdapter) obj).getLabel(null); } return obj.toString(); }
构建setInput的模型:
1. 只需要预先放入根节点即可。子节点的载入就依赖于点击+号,lazy载入了。
private PendingTreeNode buildPendingLazyContent() { PendingTreeNode root = new PendingTreeNode(null); PendingTreeNode level_1_1 = new PendingTreeNode("1.1"); root.addChild(level_1_1); return root; }
其他代码:
viewer.setLabelProvider(new PendingTreeViewerLabelProvider()); viewer.setContentProvider(new PendingLazyContentProvider()); viewer.setInput(this.buildPendingLazyContent());
四. 总结
1. 简单模式适合于你一次性将数据全部载入,而后在setInput一次显示出来。
2. Lazy Load模式(简单)适合于性能影响不大的点击+号Lazy的载入数据。
3. Lazy Load模式(显示Pending)适合于载入过程比较长,为了提供用户交互而使用
4. Lazy Load模式都存在着遍历的问题。因为有的模型的子节点还没有完全载入,而你却依赖所有这些子节点的时候,这时就必须在代码里面将所有子节点打开,让其载入所有子数据至最后一层,对于(简单)和(显示Pending)都可以这么去做。
5. 还是4的情况,由于(显示Pending)是异步载入的,需要更复杂的判断,并基于线程去判断某节点是否载入完毕,等你自己去实现的时候,你会发现这是有多复杂的^-^
五. 其他相关的类
org.eclipse.jface.viewers.TreeNode
org.eclipse.jface.viewers.TreeNodeContentProvider
org.eclipse.jface.viewers.ArrayContentProvider
org.eclipse.ui.progress.IDeferredWorkbenchAdapter
org.eclipse.ui.progress.DeferredTreeContentManager
- cn.iwoo.treeviewer.provider.rar (24.5 KB)
- 描述: 源文件
- 下载次数: 197
发表评论
-
借用Eclipse 实现文本内容对比功能
2009-10-28 17:57 9536一 相关知识 org.eclipse.compare ... -
SWT的图片叠加效果
2009-09-23 10:58 3884一. 核心类说明 ImageDescr ... -
SWT多线程
2009-07-15 23:42 4965一:基本概念 在SWT内,有一个UI主线程的概念,自定义的线程 ... -
去掉plugin_customization.ini文件,在代码中实现配置功能
2009-06-03 09:59 1525一. 常规做法 ... -
StyledText 的Traverse,VerifyKey,MouseListener分析
2009-05-06 10:36 2644目标功能: 随便焦点的跳转(键盘的上下左右操作;键盘的 ... -
Java在Eclipse环境下调用Subclipse接口完成SVN操作(附源码)
2009-04-19 19:16 7869Java在Eclipse环境下调用Subclipse接口完成S ... -
JFace的FieldDecoration / DecoratedField 使用详解
2009-04-07 13:01 1346关键代码: IControlCreator cont ... -
RCP异常:The editor class could not be instantiated
2009-03-30 16:26 0Unable to create this part due ... -
NightLabs 开源的swt pdf viewer (Eclipse plugin)
2009-03-26 12:37 1293http://wiki.nightlabs.de/en/PDF ... -
有关于《OSGI进阶》中的org.eclipse.equinox.servlet.api.jar
2009-02-12 09:56 3662具体可以参见JavaEye问答频道: http://www.i ... -
Eclipse在创建Plug-in项目时的Target platform选项的说明
2009-01-15 11:48 6924Target PlatForm 插件的运行平台. Eclip ... -
eclipse中的线程
2009-01-09 19:23 1829见: http://www.eclipseworld.org/ ... -
SWT 如何选中Spinner中所有的数字
2008-12-29 11:30 2434http://dev.eclipse.org/newslist ... -
SWT 添加全局的监听
2008-12-03 12:26 4889Display 有这么一个方法: public void ... -
SWT得到调用ActiveX所需的控件标识符
2008-11-23 16:51 2857怎么使用ole,网上别人的代码已经很多了. 下面是说怎么得到o ... -
Text,Combo添加内容辅助功能[代码提示] [可下载代码]
2008-11-16 23:08 34651. 类 a) ContentProp ... -
SWT byte[]与Image的相互转换
2008-11-06 17:01 45071. 从byte[]得到Image private stat ... -
JFACE 用好StructuredViewer [可下载源代码] - 列表类型的动态控件创建
2008-11-06 10:41 1798功能: 1. 类似一个TableViewer的功能. 2. 可 ... -
AWT, SWING, SWT, JFACE 比较
2008-11-03 10:36 1851AWT Abstract Windows Toolkit(AW ... -
SWT StyledText试用 [可下载项目代码]
2008-10-13 09:57 3729效果图 和 源代码: 效果图 源代码 点击下载. 注: 代 ...
相关推荐
Eclipse开发经典教程-TreeViewer组件
SWT的一个实例 TreeViewer的小程序范例
基于python3.4,pyqt5和matplotlib的微软决二叉策树查看工具,内含源码
是一款针对后缀名为.tre .tree .nwk 等树文件的打开及编辑软件
XML Tree Viewer,xml 树形结构查看器,是xml有关的开发人员的必备工具
#TreeViewer 交互式进化树可视化 此 Web 服务旨在提供完全交互式的进化树查看器。 该项目仍处于重开发阶段,可能会频繁出现大规模更改。 要测试 TreeViewer 的基本版本,请单击。 依赖项包括 D3.js、Bootstrap 和 ...
eclipse 集成 JSON2XML Tree Viewer,json文本可以转换成xml和Tree
实现datagrid and treeviewer的drag drop, 只可单向drag
第三篇主要讲述插件开发的高级内容,包括开发高级内容、富客户端平台技术(RCP)、Draw2d,以及GEF介绍与实现等4个章节;第四篇则围绕插件开发和GEF应用两个主题,精心设计了两个程序开发实例,使读者能更加全面地...
qt 树形图 treeviewer 鼠标点击过滤
1. TreeViewer进行目录切换时,TableViewer窗体有时会变成空白 2. 有特殊字符的过滤操作将导致异常 3. 重命名没有考虑特殊字符 4. 有大量文件(几百个以上)的目录会打开的很慢 5. 文件删除失败时没有提示###### 新...
本实例完成了bootstrap TreeView的各种选择的事件触发,选中后打印出树节点的相关信息,包括单选,全选,父级和定位
TreeViewer进行目录切换时,TableViewer窗体有时会变成空白 2. 有特殊字符的过滤操作将导致异常 3. 重命名没有考虑特殊字符 4. 有大量文件(几百个以上)的目录会打开的很慢 5. 文件删除失败时没有提示...
RCP实现的带有复选框的TreeViewer,选择相关行,能够提示用户相关信息
无论是学生子系统还是管理员子系统,都需要从数据库中读取院系的信息以及每个院系所开设的课程信息,将其存放在DataSet里面,然后把数据绑定到控件并显示出来。由于每个院系都开设多门课程供学生选择,院系信息和...
无论是学生子系统还是管理员子系统,都需要从数据库中读取院系的信息以及每个院系所开设的课程信息,将其存放在DataSet里面,然后把数据绑定到控件并显示出来。由于每个院系都开设多门课程供学生选择,院系信息和...
基于C# winform,写的一个自定义TreeView和TreeNode,可以在每个自定义节点旁添加按钮。
<br>详细资料及截图请参考压缩包中doc/how to run.doc文档 <br>新特性: 支持拽入:可以将源/目标目录以及配置文件拽入相对应窗口 支持双击:在窗口双击可以打开相应功能 新TreeViewer窗口:更加...
包含9个部分,另附核心编程——插件、界面与Web开发 (节选)> 9个部分分别是:SWT布局,常用SWT组件,SWT事件,TreeViewer组件,展现组件,常用快捷键,插件安装,单元测试,代码重构