转载自: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;
}
}
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;
}
}
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 ,如果我们需要带checkbox 的treeViewer ,简单,只需要更改
final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);
把TreeViewer 换成CheckboxTreeViewer 。这就是mvc 的好处了。
但现实中我们多用ContainerCheckedTreeViewer 代替CheckboxTreeViewer ,因为这个提供了更多的功能。
CheckboxTreeViewer 是TreeViewer 的子类, ContainerCheckedTreeViewer 是CheckboxTreeViewer 的子类,所以可以随便替换。
替换后:
final ContainerCheckedTreeViewer treeViewer = new ContainerCheckedTreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);
五、treeviewer 和tableviewer 都介绍过了,考虑一下把两个结合起来是不是我们经常需要的情况。尝试一下吧。
六、souce 下载:http://www.blogjava.net/Files/dreamstone/jface-6.rar