创建虚树与虚表

创建虚树与虚表

关键字: virtual tree table

转自: http://liugang594.iteye.com/blog/159449

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

 

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

 

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

 

一、VIRTUAL样式的设置

 

显然这是必须的,例如:

Java代码 复制代码
  1. //构建树   
  2. Tree tree = new Tree(composite, SWT.BORDER | SWT.VIRTUAL);   
  3.   
  4. //构建表   
  5. Table table = new Table(composite, SWT.BORDER | SWT.VIRTUAL);  

 

二、设置显示的Item数

 

例如:

Java代码 复制代码
  1. table.setItemCount(COUNT);   
  2.   
  3. tree.setItemCount(COUNT);  

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

 

三、增加SetData监听

 

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

 

Java代码 复制代码
  1. tree.addListener(SWT.SetData, new Listener() {    
  2.     public void handleEvent(Event event) {    
  3.                      ……   
  4.            }   
  5. }   
  6.   
  7. table.addListener(SWT.SetData, new Listener() {    
  8.     public void handleEvent(Event event) {    
  9.                      ……   
  10.            }   
  11. }  

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

 

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

 

四、记录结点信息

 

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

 

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

 

四、示例

 

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

Java代码 复制代码
  1. //setData部分   
  2. Tree tree = new Tree(shell, SWT.VIRTUAL | SWT.BORDER);   
  3. File[] roots = File.listRoots();   
  4. tree.setData(roots);   
  5.   
  6. //setItemCount   
  7. tree.setItemCount(roots.length);   
  8.   
  9. //监听部分   
  10. tree.addListener(SWT.SetData, new Listener() {   
  11.     public void handleEvent(Event event) {   
  12.         //event中得到当前正在创建的树结点和它的父结点   
  13.         TreeItem item = (TreeItem) event.item;   
  14.         TreeItem parentItem = item.getParentItem();   
  15.         File file = null;   
  16.         //如果父结点为null,说明当前结点的树的根结点(可能有多个)   
  17.         if (parentItem == null) {   
  18.             /* root-level item */  
  19.             File[] files = (File[]) tree.getData();   
  20.             file = files[event.index];   
  21.             item.setText(file.toString());   
  22.         }    
  23.         /*  
  24.         * 如果父结点不为空,则父结点记录的信息中找到一个  
  25.         * 正确的信息作为此结点的信息  
  26.         * 这里index表示此结点的序号  
  27.         */  
  28.         else {   
  29.             File[] files = (File[]) parentItem.getData();   
  30.             file = files[event.index];   
  31.             item.setText(file.getName());   
  32.         }   
  33.            
  34.         //如果是目录,认为它有将有子结点,所以记录它的信息   
  35.         if (file.isDirectory()) {   
  36.             File[] files = file.listFiles();   
  37.             if (files != null) {   
  38.                 item.setData(files);   
  39.                 item.setItemCount(files.length);   
  40.             }   
  41.         }   
  42.     }   
  43. });  

 

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

 

你可能感兴趣的:(数据结构,Blog)