Swt/Jface treeViewer的使用

转载自:http://www.cnblogs.com/huqingyu/archive/2008/04/10/1146209.html

 

上边介绍了,tableviewer ,这里介绍一下treeViewer ,总的流程类似。
一、构造一个树形结构的数据出来,这里选择国家、城市、人来构造一个树形结构,代码如下:
1
,定义一个接口

package model;
 
 import java.util.List;
 
 public interface Itree {
     public String getName();
     public void setName(String name);
     public void setChildren(List Children);
     public List getChildren();
 }

2 ,国家

package model;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class Country  implements Itree{
     private Long id;
     private String name;
     private List children = new ArrayList();
     public Country(){
     }
     public Country(String name){
         this.name = name;
     }
     public List getChildren() {
         return children;
     }
     public void setChildren(List children) {
         this.children = children;
     }
     public Long getId() {
         return id;
     }
     public void setId(Long id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     
 }

3 ,城市

package model;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class City implements Itree{
     private Long id;
     private String name;
     private List children = new ArrayList();
     public City(){
     }
     public City(String name){
         this.name = name;
     }
     public List getChildren() {
         return children;
     }
     public void setChildren(List children) {
         this.children = children;
     }
     public Long getId() {
         return id;
     }
     public void setId(Long id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
 }
 

4 ,人

 

package model;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class People implements Itree{
     private Long id;
     private String name;
     public People(){
     }
     public People(String name){
         this.name = name;
     }
     public List getChildren() {
         return null;
     }
     public void setChildren(List children) {
     }
     public Long getId() {
         return id;
     }
     public void setId(Long id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
 }

5, 把这些元素组织起来

package model;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class Factory {
     @SuppressWarnings("unchecked")
     public static List createTree(){
         //生成国家
         Country cn = new Country("中国");
         Country us = new Country("美国");
         Country jp = new Country("日本");
         //生成城市
         City beijing  = new City("北京");
         City shanghai = new City("上海");
         City newyork = new City("纽约");
         City la = new City("洛杉矶");
         City tokyo = new City("东京");
         City osaka = new City("大阪");
         //北京人
         ArrayList list = new ArrayList();
         list.add(new People("张三"));
         list.add(new People("李四"));
         list.add(new People("王五"));
         beijing.setChildren(list);
         //上海人
         list = new ArrayList();
         list.add(new People("翠花"));
         list.add(new People("小红"));
         list.add(new People("小崔"));
         shanghai.setChildren(list);
         //纽约人
         list = new ArrayList();
         list.add(new People("tom"));
         list.add(new People("rose"));
         list.add(new People("john"));
         newyork.setChildren(list);
         //洛杉矶人
         list = new ArrayList();
         list.add(new People("Sofia"));
         list.add(new People("sarah"));
         list.add(new People("Jennifer"));
         la.setChildren(list);
         //东京人
         list = new ArrayList();
         list.add(new People("渡边"));
         list.add(new People("鬼冢"));
         list.add(new People("山本"));
         tokyo.setChildren(list);
         //大阪人
         list = new ArrayList();
         list.add(new People("奈奈子"));
         list.add(new People("菜菜子"));
         list.add(new People("新垣结衣"));
         osaka.setChildren(list);
         
         //关联城市与国家
         //中国
         ArrayList citys = new ArrayList();
         citys.add(beijing);
         citys.add(shanghai);
         cn.setChildren(citys);
         //美国
         citys = new ArrayList();
         citys.add(newyork);
         citys.add(la);
         us.setChildren(citys);
         //日本
         citys = new ArrayList();
         citys.add(tokyo);
         citys.add(osaka);
         jp.setChildren(citys);
         //国家列表
         ArrayList countrys = new ArrayList();
         countrys.add(cn);
         countrys.add(us);
         countrys.add(jp);
         return countrys;
     }
 }

二、定义内容器和标签器
1,
内容器

import java.util.List;
 
 import model.Itree;
 
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
 public class TreeContentProvider implements IStructuredContentProvider, ITreeContentProvider {
         
         public Object[] getElements(Object inputElement) {
             if (inputElement instanceof List){
                 List input = (List)inputElement;
                 return input.toArray();
             }
             return new Object[0];
         }
         public Object[] getChildren(Object parentElement) {
             Itree node = (Itree)parentElement;
             List list = node.getChildren();
             if(list == null){
                 return new Object[0];
             }
             return list.toArray();
         }
         
         public boolean hasChildren(Object element) {
             Itree node = (Itree)element;
             List list = node.getChildren();
             return !(list == null || list.isEmpty());
         }
         //以下三个函数根据需要填充
         public Object getParent(Object element) {
             return null;
         }
         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
         }
         public void dispose() {
         }
     }

2 ,标签器:

import model.Itree;
 
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.swt.graphics.Image;
 
 public class TreeLabelProvider extends LabelProvider implements ILabelProvider {
         public String getText(Object element) {
             Itree node = (Itree)element;
             return node.getName();
         }
         public Image getImage(Object element) {
             return null;
         }
     }

三、好了,准备工作做好了,把上边的内容利用起来就好了。

 

import model.Factory;
 
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Tree;
 
 
 public class TestTreeViewer {
     
     private static Tree tree;
     public static void main(String[] args) {
         final Display display = Display.getDefault();
         final Shell shell = new Shell();
         shell.setSize(500, 375);
         shell.setText("SWT Application");
         //
         final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);
         tree = treeViewer.getTree();
         tree.setBounds(83, 75, 264, 185);
         
         treeViewer.setLabelProvider(new TreeLabelProvider());
         treeViewer.setContentProvider(new TreeContentProvider());
         treeViewer.setInput(Factory.createTree());
         
         shell.open();
         shell.setLayout(new FillLayout());
         shell.layout();
         while (!shell.isDisposed()) {
             if (!display.readAndDispatch())
                 display.sleep();
         }
     }
 
 }

 

看看是不是已经实现了treeViewer
四、上边是简单的treeViewer ,如果我们需要带checkboxtreeViewer ,简单,只需要更改

 final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);

 

TreeViewer 换成CheckboxTreeViewer 。这就是mvc 的好处了。
但现实中我们多用ContainerCheckedTreeViewer 代替CheckboxTreeViewer ,因为这个提供了更多的功能。
CheckboxTreeViewer
TreeViewer 的子类,  ContainerCheckedTreeViewerCheckboxTreeViewer 的子类,所以可以随便替换。
替换后:

final ContainerCheckedTreeViewer treeViewer = new ContainerCheckedTreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);

五、treeviewertableviewer 都介绍过了,考虑一下把两个结合起来是不是我们经常需要的情况。尝试一下吧。
六、souce 下载:http://www.blogjava.net/Files/dreamstone/jface-6.rar

你可能感兴趣的:(treeview)