`
liugang594
  • 浏览: 987561 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

创建虚树与虚表

阅读更多

构建一棵树或表,有时,如果数据量太大,那么一次性加载所有的数据将耗费大量的时间。SWT中提供了一个虚拟的样式用以推迟对数据的加载,通过这种分散加载的方式来加速树或表的构建和显示。

 

要实现一棵虚树或一个虚表,我们需要用到VIRTUAL样式。

 

构建虚树/表的几个需要关键点:

 

一、VIRTUAL样式的设置

 

显然这是必须的,例如:

//构建树
Tree tree = new Tree(composite, SWT.BORDER | SWT.VIRTUAL);

//构建表
Table table = new Table(composite, SWT.BORDER | SWT.VIRTUAL);

 

二、设置显示的Item数

 

例如:

table.setItemCount(COUNT);

tree.setItemCount(COUNT);

这个也是必须的,因为在下面的SetData事件里需要根据这个Item数来决定监听事件的调用次数。通常这个值设置为树或表最初显示时的可见item数。在不确定的时候要选择一个合适的值来确保显示的正确性。

 

三、增加SetData监听

 

以上两步完成后,我们需要增加一个SWT的SetData监听事件来完成最后的任务。例如:

 

tree.addListener(SWT.SetData, new Listener() { 
	public void handleEvent(Event event) { 
                     ……
           }
}

table.addListener(SWT.SetData, new Listener() { 
	public void handleEvent(Event event) { 
                     ……
           }
}

这个事件在两种情况下都会被调用:(1)树结点展开的时候。(2)窗口可见的时候。

 

这个方法就是用来完成具体的当树要显示或者一个结点要打开时,用来计算子结点数和决定各个子结点的内容。

 

四、记录结点信息

 

这个很重要,但对于虚树/表本身的构建来说,不属于它的一部分。不过我还是认为这是很重要的。

 

显然,为了正确构建树结点或树结点的子结点,我们需要有一个记录结点信息的地方,这个见仁见智,各人可能有各人的方法。例如,通常可以使用setData(Object data)方法来记录各个结点的信息,看下面的示例。

 

四、示例

 

以树为例,例如显示目录结构的树:

//setData部分
Tree tree = new Tree(shell, SWT.VIRTUAL | SWT.BORDER);
File[] roots = File.listRoots();
tree.setData(roots);

//setItemCount
tree.setItemCount(roots.length);

//监听部分
tree.addListener(SWT.SetData, new Listener() {
	public void handleEvent(Event event) {
		//event中得到当前正在创建的树结点和它的父结点
		TreeItem item = (TreeItem) event.item;
		TreeItem parentItem = item.getParentItem();
		File file = null;
		//如果父结点为null,说明当前结点的树的根结点(可能有多个)
		if (parentItem == null) {
			/* root-level item */
			File[] files = (File[]) tree.getData();
			file = files[event.index];
			item.setText(file.toString());
		} 
		/*
		* 如果父结点不为空,则父结点记录的信息中找到一个
		* 正确的信息作为此结点的信息
		* 这里index表示此结点的序号
		*/
		else {
			File[] files = (File[]) parentItem.getData();
			file = files[event.index];
			item.setText(file.getName());
		}
		
		//如果是目录,认为它有将有子结点,所以记录它的信息
		if (file.isDirectory()) {
			File[] files = file.listFiles();
			if (files != null) {
				item.setData(files);
				item.setItemCount(files.length);
			}
		}
	}
});

 

对于与虚树/表,JFace里有一个ILazyTreeContentProvider和ILazyContentProvider,可以试试它的用法。

 

分享到:
评论

相关推荐

    关于异质树的C++实现

    在C++中实现异质树,我们通常会利用C++的多态性来设计一个基类表示通用节点,然后通过继承基类创建不同类型的子节点。本文将深入探讨如何使用面向对象编程技术来实现异质树。 首先,我们需要定义一个抽象基类,它...

    N叉哈夫曼树研究

    当字符集的大小不能完美地适应N叉结构时,可以通过添加出现概率为0的虚结点来填充树的底部,确保树的结构尽可能接近满N叉树,从而提高编码效率。 #### 示例分析 以N=3,字符集S={A,B,C,D,E,F},权重W=[1,2,3,4,5,6...

    异质树的实现--C++实现

    `main.h`可能包含了类的定义和声明,尤其是与异质树相关的类,比如树节点的基类和派生类。 在C++中实现异质树,首先我们需要定义一个基类,例如叫做`TreeNode`,它可能包含基本的节点信息,如节点值、指向子节点的...

    sqlite数据库基本操作+无限级别树型框

    3. **创建表**:使用`CREATE TABLE`语句定义表结构,包括字段名、数据类型和约束条件。 4. **插入数据**:使用`INSERT INTO`语句向表中添加记录。 5. **查询数据**:使用`SELECT`语句从表中检索信息,可以配合`...

    0055路由-OSPF虚链路配置01

    - 虚链路不会在LSDB(Link State Database)中创建额外的条目,而是作为普通OSPF接口处理。 - 如果虚链路穿越的区域被配置为stub或nssa,那么虚链路将不能正常工作,因为这些区域不接收或传播Type 5 LSA(外部路由)...

    数据结构之树与二叉树算法总结

    ### 数据结构之树与二叉树算法总结 #### 一、引言 在计算机科学领域,数据结构扮演着至关重要的角色。其中,树形结构因其灵活性和高效性被广泛应用于各种场景之中。本文将深入探讨树与二叉树的相关概念,并通过具体...

    异质树c++实现

    在异质树中,我们可以定义一个基类`Node`,它代表树的基本结构,然后创建各种特定类型的节点类,如`IntegerNode`、`StringNode`等,这些类继承自`Node`基类。 ```cpp class Node { public: virtual ~Node() {} //...

    c++封装的二叉排序树

    - 若树为空,创建根节点。 - 否则,找到合适的插入位置,插入新节点。 #### 三、重要知识点详解 1. **递归与非递归插入** - **递归插入**:通常情况下,插入操作可以采用递归的方式完成。这种方式直观且简洁,...

    二叉链表为存储结构二叉链表为存储结构.doc

    创建二叉链表的主要思想是添加虚结点,将二叉树中的每一个结点都扩充成度为 2 的结点,然后对扩充后的二叉树按前序遍历得到前序序列,依次输入序列中各结点,建立二叉链表。 例如,要创建 5.13 的二叉树对应的二叉...

    二分法与统计问题(线段树)[总结].pdf

    建立线段树的过程是从根节点开始,递归地创建左子树和右子树,直到区间缩小至单个元素。插入线段时,根据线段与当前节点代表的区间的相对位置,更新节点的计数器和子树。 1.3 应用优势 线段树的优势在于其高效地...

    数据结构树与二叉树算法汇总

    根据给定的信息,本文将对数据结构中的树与二叉树相关的算法进行详细的解析与总结。主要内容包括:如何使用二叉树表示算术表达式、二叉树的顺序存储结构及其中叶子节点的计算方法、以及如何递归地构建二叉树并判断其...

    心希盼 C++ 数据结构 广义表

    与传统的数组或链表不同,广义表允许元素本身也是列表,这种特性使其具有强大的表达能力。在C++中,广义表通常通过指针和结构体来实现,可以利用面向对象的特性,如类和继承,来进一步抽象和封装。 1. **广义表的...

    有点难度的C++面试题

    对象创建时,会为其分配一个指向虚函数表的指针,这样在运行时就可以根据对象类型找到正确的虚函数来调用,实现多态。 以上这些知识点都是C++面试中常见的难点,理解和掌握它们对于深入理解C++语言和编写高质量的...

    C/C++软件开发工程师面试经验专业知识分享

    - **虚函数指针初始化**:创建子类对象时,编译器会先初始化虚函数指针vptr,使其指向基类的虚函数表。之后,在调用子类的构造函数时,vptr会被重新设置,指向子类的虚函数表。这样就确保了即使通过基类指针调用虚...

    易语言利用树形框展示文件目录源码

    在易语言中,我们可以创建一个树形框控件,并通过编程动态添加节点,这些节点可以代表文件夹或文件。每个节点的文本通常为文件或文件夹的名称,而展开/折叠操作则可以展示或隐藏其子节点。 其次,获取文件图标是...

    c++实现的异质树

    二、虚函数与多态性 在C++中,多态性是通过虚函数实现的,虚函数使得子类能够重写父类的函数,从而在运行时根据对象的实际类型动态地调用相应的函数。声明一个函数为虚函数,需要在基类的函数声明前加上`virtual`...

    异质树得c++实现

    1. **类与对象**:首先,你需要定义一个基类来表示树的基本节点。这个基类可以包含通用属性,如节点值、指向子节点的指针等。然后,根据需要为不同类型的节点创建派生类,每个类都带有特定的属性和行为。 2. **继承...

    VLAN虚接口配置Vlan间通信(三层交换机或单臂路由) 交换机STP协议配置 MSTP协议配置分析 VRRP配置【给你即可用】.pdf

    VLAN的配置主要通过创建虚拟接口(VLAN虚接口),为每个VLAN分配唯一的标识符(VLAN ID),并配置相应的网络设备接口加入对应的VLAN。在配置VLAN时,要确保每个网络段的设备都了解VLAN的划分和相关的配置规则。 ...

Global site tag (gtag.js) - Google Analytics