************************************************************************************* 作者:陈刚,桂林人,97年毕业于广西师范大学数学系,一名热爱Java的普通程序员。 Email: [email protected] blog: glchengang.yeah.net *************************************************************************************
/* * @author 陈刚 ,2004-8-21 0:54:20 * Email: [email protected] * Blog : glchengang.yeah.net */ package book.c3.e1;
import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell;
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 Object());//设置输入对象的方法与前面相同
}
/** * 内容提供器。由它决定那些对象应该输出在TreeViewer里显示 */ private static final class MyContentProvider implements ITreeContentProvider { /** * 由这个方法决定树的顶级显示那些对象。在此方法里生成了三个Country对象 * @param inputElement 用tv.setInput()方法输入的那个对象,在这里没有使用这个对象 */ public Object[] getElements(Object inputElement) { String[] obj = new String[3]; obj[0] = "中国"; obj[1] = "美国"; obj[2] = "英国"; return obj; }
/** * 由这个方法决定结点应该显示那些子结点。在这里也不管父结点是什么,每个结点都统一有三个字结点 * @param parentElement 被点击的结点(父结点) */ public Object[] getChildren(Object parentElement) { String[] obj = new String[4]; obj[0] = "桂林"; obj[1] = "北京"; obj[2] = "纽约"; obj[3] = "伦敦"; return obj; }
/** * 判断某结点是否有子结点。在这里不管3721,全返回真,即都有子结点。这时结点前都有一个“+”号图标 * @param element 需要判断是否有子的结点 */ public boolean hasChildren(Object element) { return true; }
/** * 取得某结点的父结点。极少需要实现此方法 */ public Object getParent(Object element) { return null; }
/** * 当TreeViewer被销毁时将执行这个方法。极少需要实现此方法 */ public void dispose() {}
/** * 当tv.setInput()发生变化时调用此方法。极少需要实现此方法 */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} }
/** * 标签提供器。主要负责每一单个对象在TreeViewer中的显示(文字、图象) */ private static final class MyLableProvider implements ILabelProvider {
/** * 显示什么图片 * @param 结点 * @return 可以为null值 */ public Image getImage(Object element) { // ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); // return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK); return null; }
/** * 显示什么文字 * @param 结点 * @return 不能为null值 */ public String getText(Object element) { return (String) element;
}
public void addListener(ILabelProviderListener listener) {}
public void dispose() {}
public boolean isLabelProperty(Object element, String property) { return false; }
public void removeListener(ILabelProviderListener listener) {} }
/** * 标签提供器。如果你赚上面的MyLableProvider那些没用的方法碍眼, * Eclipse中有一个ILabelProvider的缺省实现LabelProvider,继承它也行 */ // private static final class MyLableProvider extends LabelProvider { // public String getText(Object element) { // return (String)element; // } // } }
在这里面“标签器”比较简单,甚至可以不要(可以将实体类的toString方法改写,这样不要标签器则TreeViewer会自动调用实体类的toString方法)。“内容器”是理解TreeViewer的关键,程序里已有详细注释了,在这里再给出TreeVeiwer启动、点击结点、关闭三种操作时“内容器”里几个方法的时序图。


|