`
eclipsesbs
  • 浏览: 19823 次
社区版块
存档分类
最新评论

第三天:那么TreeViewer怎么实现?

阅读更多

作者:梁祺 (eclipsesbs@gmail.com)

来自:http://www.benisoft.net/day3/index.html

 

今天我们来看一下TreeViewer,同样是使用“Plug-in with a view”模版,不过在向导的最后一页改用Tree viewer。

启动Eclipse前,先把eclipse.tutorial.day2的项目关闭,免得出现两个Sample View。启动Eclipse后, 找到Sample View,现在Sample View显示的是一个树状结构,有根节点,父节点,子节点组成。

双击Package Explorer View里的plug-in.xml,打开Plug-in Editor的Extensions子页, 你会发现内容和前面的例子一模一样。点击class打开Java类。

在Sample View里,TableViewer改成了TreeViewer了,多了一个DrillDownAdapter, DrillDownAdapter这里就不介绍了。

public class SampleView extends ViewPart {

    /**
     * The ID of the view as specified by the extension.
     */

    public static final String ID = \"eclipse.tutorial.day3.views.SampleView\";

    private TreeViewer viewer;
    private DrillDownAdapter drillDownAdapter;
    private Action action1;
    private Action action2;
    private Action doubleClickAction;

还多了TreeObject和TreeParent两个内部类,这两个类比较简单,值得一提的是TreeObject实现IAdaptable接口。 对这个例子而言,这不是必须的。使用IAdaptable可以避免将真正的Model对象放在树上, 甚至可以更换Model对象而不用重新生成树。IAdaptable提供很高的灵活性。

    class TreeObject implements IAdaptable {
        private String name;
        private TreeParent parent;
        ...
        public Object getAdapter(Class key) {
            return null;
        }
    }

ViewContentProvider实现了新接口ITreeContentProvider。 当需要显示TreeViewer的内容时,第一个调用的方法是getElement(),它接受参数parent, 这样根据不同的父节点parent,getElement()可以返回相应的子节点。 如果parent是getViewSite()返回的viewSite(就是viewer.setInput()时设置的对象),就返回根节点, 否则返回父节点的子节点。接下来getParent(),getChildren()和hasChildren()这三个方法必须行为一致, 否则随着TreeViewer使用,有可能碰到一些非常难以调试的问题,比如想要高亮选中某个节点,可能会不工作。

    class ViewContentProvider implements IStructuredContentProvider, 
                                           ITreeContentProvider {
        private TreeParent invisibleRoot;

        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }
        public void dispose() {
        }
        public Object[] getElements(Object parent) {
            if (parent.equals(getViewSite())) {
                if (invisibleRoot==null) initialize();
                return getChildren(invisibleRoot);
            }
            return getChildren(parent);
        }
        public Object getParent(Object child) {
            if (child instanceof TreeObject) {
                return ((TreeObject)child).getParent();
            }
            return null;
        }
        public Object [] getChildren(Object parent) {
            if (parent instanceof TreeParent) {
                return ((TreeParent)parent).getChildren();
            }
            return new Object[0];
        }
        public boolean hasChildren(Object parent) {
            if (parent instanceof TreeParent)
                return ((TreeParent)parent).hasChildren();
            return false;
        }
        ...
    }

LabelProvider实现了getImage()方法, 为每个节点指定图标。

    class ViewLabelProvider extends LabelProvider {

        public String getText(Object obj) {
            return obj.toString();
        }
        public Image getImage(Object obj) {
            String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
            if (obj instanceof TreeParent)
               imageKey = ISharedImages.IMG_OBJ_FOLDER;
            return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
        }
    }

Eclipse还提供了IColorProvider和IFontProvider使得我们可以为某些节点指定不同的颜色和字体。 IColorProvider提供getForeground(...)和getBackground(...)两个方法,分别用于指定前景色和背景色。 IFontProvider提供getFont(...)方法,指定显示时使用的字体。

    class ViewLabelProvider extends LabelProvider implements IColorProvider, IFontProvider {

        public String getText(Object obj) {
            return obj.toString();
        }
        public Image getImage(Object obj) {
            String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
            if (obj instanceof TreeParent)
               imageKey = ISharedImages.IMG_OBJ_FOLDER;
            return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
        }
        public Font getFont(Object element) {
            if (element instanceof TreeParent) 
                return getSite().getShell().getDisplay().getSystemFont();
            return null;
        }
        public Color getForeground(Object element) {
            if (element instanceof TreeParent) 
                return getSite().getShell().getDisplay().getSystemColor(SWT.COLOR_RED);
            return null;
        }
        public Color getBackground(Object element) {
            if (element instanceof TreeParent) 
                return getSite().getShell().getDisplay().getSystemColor(SWT.COLOR_CYAN);
            return null;
        }
    }

到这里,我们看了如何创建TreeViewer,TreeViewer和TableViewer一样,关键就是Content Provider, Content Provider提供需要显示的对象,Label Provider指定如何显示这些对象。

分享到:
评论

相关推荐

    Eclipse开发经典教程-TreeViewer组件

    Eclipse开发经典教程-TreeViewer组件

    SWT TreeViewer实例

    SWT的一个实例 TreeViewer的小程序范例

    Treeviewer1.0

    基于python3.4,pyqt5和matplotlib的微软决二叉策树查看工具,内含源码

    treeviewer

    是一款针对后缀名为.tre .tree .nwk 等树文件的打开及编辑软件

    TreeViewer:使用 D3.js 的交互式进化树查看器

    #TreeViewer 交互式进化树可视化 此 Web 服务旨在提供完全交互式的进化树查看器。 该项目仍处于重开发阶段,可能会频繁出现大规模更改。 要测试 TreeViewer 的基本版本,请单击。 依赖项包括 D3.js、Bootstrap 和 ...

    XML TreeViewer

    XML Tree Viewer,xml 树形结构查看器,是xml有关的开发人员的必备工具

    Eclipse插件开发学习笔记 第三四篇(26-28)+原代码.rar

    第三篇主要讲述插件开发的高级内容,包括开发高级内容、富客户端平台技术(RCP)、Draw2d,以及GEF介绍与实现等4个章节;第四篇则围绕插件开发和GEF应用两个主题,精心设计了两个程序开发实例,使读者能更加全面地...

    [原创]用SWT/JFace实现的深路径自动生成软件(附源码)

    不过由于是SWT+JFace实现的桌面程序,想研究Java桌面程序应用的朋友也可以下载看看,其一些特性及设计思路还是比较有用的。 <br>详细资料及截图请参考压缩包中doc/how to run.doc文档 <br>新特性: 支持拽...

    用swt/jface实现的资源浏览器jExplorer

    TreeViewer进行目录切换时,TableViewer窗体有时会变成空白 2. 有特殊字符的过滤操作将导致异常 3. 重命名没有考虑特殊字符 4. 有大量文件(几百个以上)的目录会打开的很慢 5. 文件删除失败时没有提示...

    用SWT/JFace实现的资源管理器jExplorerV0.5(附源码)

    重写图标载入方法,已经可以实现图标动态载入和识别 3. 重写TableViewer中tableColumn生成载入方法,已经可以实现tablecolumn的半动态载入和识别 4. 实现动态识别文件类型 5. 进行删除操作时,对删除的...

    jExplorer——SWT做的一个文件浏览器

    3. 重写TableViewer中tableColumn生成载入方法,已经可以实现tablecolumn的半动态载入和识别 4. 实现动态识别文件类型 5. 进行删除操作时,对删除的文件进行识别 6. 更新添加了一些FileUtil中的方法,并且把这个类的...

    RCP实现的带有复选框的Tree

    RCP实现的带有复选框的TreeViewer,选择相关行,能够提示用户相关信息

    DataGrid Treeview Drag and drop

    实现datagrid and treeviewer的drag drop, 只可单向drag

    eclipse 集成 JSON2XML Tree Viewer

    eclipse 集成 JSON2XML Tree Viewer,json文本可以转换成xml和Tree

    Eclipse_Swt_Jface_核心应用_部分19

    第3章 Eclipse开发环境概述 22 3.1 Eclipse界面一览 22 3.2 Eclipse项目的文件结构 23 3.2.1 设置编译后.class文件的保存目录 23 3.2.2 导入项目使用的包 25 3.2.3 设置编译方式 26 3.2.4 运行程序 27 ...

    QT 树形图带右键 鼠标点击过滤

    qt 树形图 treeviewer 鼠标点击过滤

    SES_Tbx_Matlab

    介绍Wismar应用科学大学的计算工程与自动化研究小组(CEA)已开发了软件“ SES_Tbx_Matlab”。 该软件的目的是使用系统实体结构(SES)对系统变量(系统结构和参数配置)进行基于本体的建模。... 新增工具:TREEVIEWER

    bootstrap TreeView全选单选,定位选触发事件实例

    本实例完成了bootstrap TreeView的各种选择的事件触发,选中后打印出树节点的相关信息,包括单选,全选,父级和定位

Global site tag (gtag.js) - Google Analytics