Eclipse插件开发系列7.TreeViewer的使用(1)一个简单例子

类别:Java 点击:0 评论:0 推荐:

*************************************************************************************
作者:陈刚,桂林人,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启动、点击结点、关闭三种操作时“内容器”里几个方法的时序图。

 

本文地址:http://com.8s8s.com/it/it16000.htm