*************************************************************************************
作者:陈刚,桂林人,97年毕业于广西师范大学数学系,一名热爱Java的普通程序员。
Email:? glchengang@163.com
blog:glchengang.yeah.net
*************************************************************************************
上面的例子很简单,主要让大家明白几个关键Provider类的方法的使用。下面一个例子更接近于实际项目一些。这个例子有三个实体类:国家、城市、人,它们都实现了TreeEntry接口,这三个实体是有层级关系的。另外还写了一个工厂类来生成TreeViewer.setInput所需要的参数。
这个例子比较长,为了大家阅读方便,在此说明一下:实体类可以看做JAVA类对数据库表的一个一一映射,类的属性就相当于表的一个字段。按照JAVA的通常规范写法实体类中每一个属性都附加了set/get方法,所以代码看起来很长,实际的内容却没多少,大家可以看看实体的UML图就应该对三个实体类的关系很清楚了。
/*
?* @author 陈刚 ,2004-8-21 18:25:18
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
/**
?* 树的Entry的接口
?*/
public interface TreeEntry {
??? public String getName();
??? public void setName(String name);
}
?
/*
?* @author 陈刚 ,2004-8-21 15:32:15
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
import java.util.List;
/**
?* 国家实体类
?*/
public class Country implements TreeEntry{
??? private String name; //国家名
??? private List cities; //此国家所包含的的城市的集合,集合元素为City对象
??? public Country() {}
??? public Country(String name) {
??????? this.name = name;
??? }
??? public String getName() {
??????? return name;
??? }
??? public void setName(String name) {
??????? this.name = name;
??? }
??? public List getCities() {
??????? return cities;
??? }
??? public void setCities(List cities) {
??????? this.cities = cities;
??? }
}
?
/*
?* @author 陈刚 ,2004-8-21 15:33:17
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
import java.util.List;
/**
?* 城市的实体类
?*/
public class City implements TreeEntry{
??? private String name;//城市名
??? private List peoples;
??? public City() {}
??? public City(String name) {
??????? this.name = name;
??? }
??? public String getName() {
??????? return name;
??? }
??? public void setName(String name) {
??????? this.name = name;
??? }
??? public List getPeoples() {
??????? return peoples;
??? }
??? public void setPeoples(List peoples) {
??????? this.peoples = peoples;
??? }
}
?
/*
?* @author 陈刚 ,2004-8-21 18:15:53
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
/**
?* 人的实体类
?*/
public class People implements TreeEntry{
??? private String name;
??? public People() {}
??? public People(String name) {
??????? this.name = name;
??? }
??? public String getName() {
??????? return name;
??? }
??? public void setName(String name) {
??????? this.name = name;
??? }
}
?
/*
?* @author 陈刚 ,2004-8-21 17:52:27
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
import java.util.ArrayList;
import java.util.List;
/**
?* 此类负责生成TreeViewer的方法setInput所需要的参数
?*/
public class TvInputFactory {
??? public Object build() {
??????? /*
???????? * 生成顶级的三个对象
???????? */
??????? Country[] countryArray = new Country[3];
??????? countryArray[0] = new Country("中国");
??????? countryArray[1] = new Country("美国");
??????? countryArray[2] = new Country("英国");
??????? /*
???????? * 生成中国的三个城市
???????? */
??????? List chinaList = new ArrayList();
??????? chinaList.add(new City("北京"));
??????? City glCity = new City("桂林");
??????? chinaList.add(glCity);
??????? City nnCity = new City("南宁");
??????? chinaList.add(nnCity);
??????? countryArray[0].setCities(chinaList);
??????? /*
???????? * 生成美国的两个城市
???????? */
??????? List usaList = new ArrayList();
??????? usaList.add(new City("纽约"));
??????? usaList.add(new City("芝加哥"));
??????? countryArray[1].setCities(usaList);
??????? /*
???????? * 生成城市里的人
???????? */
??????? {
??????????? List list = new ArrayList();
??????????? list.add(new People("陈刚"));
??????????? list.add(new People("陈知行"));
??????????? list.add(new People("韩立新"));
??????????? glCity.setPeoples(list);
??????? }
??????? {
??????????? List list = new ArrayList();
??????????? list.add(new People("桃子"));
??????????? list.add(new People("林雅仕"));
??????????? list.add(new People("陈常恩"));
??????????? nnCity.setPeoples(list);
??????? }
??????? return countryArray;
??? }
}
?
?
/*
?* @author 陈刚 ,2004-8-21 0:54:20
?* Email: glchengang@yeah.net
?* Blog : glchengang.yeah.net
?*/
package book.c3.e2;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import java.util.List;
public class S3_1 {
??? public static void main(String[] args) {
??????? S3_1 window = new S3_1();
??????? window.open();
??? }
??? public void open() {
??????? final Display display = new Display();
??????? final Shell shell = new Shell();
??????? shell.setLayout(new FillLayout());
??????? ui(shell);
??????? shell.open();
??????? while (!shell.isDisposed()) {
??????????? if (!display.readAndDispatch())
??????????????? display.sleep();
??????? }
??? }
??? private void ui(Shell shell) {
??????? Composite c = new Composite(shell, SWT.NONE);
??????? c.setLayout(new FillLayout());
??????? TreeViewer tv = new TreeViewer(c, SWT.BORDER);
??????? tv.setContentProvider(new MyContentProvider());
??????? tv.setLabelProvider(new MyLableProvider());
??????? tv.setInput(new TvInputFactory().build());//设置输入对象的方法与前面相同
??? }
??? /**
???? * 内容提供器。由它决定那些对象应该输出在TreeViewer里显示
???? */
??? private static final class MyContentProvider implements ITreeContentProvider {
??????? /**
???????? * 由这个方法决定树的顶级显示那些对象。在此方法里生成了三个Country对象
???????? * @param inputElement? 用tv.setInput()方法输入的那个对象,在这里没有使用这个对象
???????? */
??????? public Object[] getElements(Object inputElement) {
??????????? if (inputElement instanceof Country[])
??????????????? return (Country[]) inputElement;
??????????? return new Object[0]; //生成一个空数组
??????? }
??????? /**
???????? * 由这个方法决定结点应该显示那些子结点。在这里也不管父结点是什么,每个结点都统一有三个字结点
???????? * @param parentElement被点击的结点(父结点)
???????? */
??????? public Object[] getChildren(Object parentElement) {
??????????? if (parentElement instanceof Country)
??????????????? return ((Country) parentElement).getCities().toArray();
??????????? else if (parentElement instanceof City)
??????????????? return ((City) parentElement).getPeoples().toArray();
??????????? return new Object[0];
??????? }
??????? /**
???????? * 判断某结点是否有子结点。在这里不管3721,全返回真,即都有子结点。这时结点前都有一个“+”号图标
???????? * @param element 需要判断是否有子的结点
???????? */
??????? public boolean hasChildren(Object element) {
??????????? //People没有结点,Country和City才可能有子结点
??????????? if (element instanceof People) {
??????????????? return false;
??????????? } else if (element instanceof Country) {
??????????????? List list = ((Country) element).getCities();
??????????????? //其子的集合不为空
??????????????? if (list != null && !list.isEmpty())
??????????????????? return true;
??????????? } else if (element instanceof City) {
??????????????? List list = ((City) element).getPeoples();
??????????????? if (list != null && !list.isEmpty())
??????????????????? return true;
??????????? }
??????????? return false;
??????? }
??????? public Object getParent(Object element) {
??????????? return null;
??????? }
??????? public void dispose() {}
??????? public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
??? }
??? /**
???? * 标签提供器。
???? */
??? private static final class MyLableProvider extends LabelProvider {
//??????? /**
//???????? * 显示什么图片
//???????? * @param 结点
//???????? * @return 可以为null值
//???????? */
//??????? public Image getImage(Object element) {
//??????????? //??????????? ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
//??????????? //??????????? return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
//??????????? return null;
//??????? }
??????? public String getText(Object element) {
??????????? if (element instanceof TreeEntry)
??????????????? return ((TreeEntry) element).getName();
??????????? return "";
??????? }
??? }
}