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

第三天:那么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组件

    创建`TreeViewer`对象是构建过程的第一步,这通常在SWT组件容器内进行。例如: ```java TreeViewer tv = new TreeViewer(composite); ``` 其中,`composite`是指定的SWT容器,用于放置`TreeViewer`。 2. **...

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

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

    Eclipse Swt/Jface核心应用 (01-03章)

    5. **第三章:高级主题** - **表与树组件**:讲解TableViewer和TreeViewer的用法,如何展示表格和树状结构数据,以及如何添加编辑功能。 - **菜单与工具栏**:介绍如何创建菜单栏、工具栏,并添加菜单项和工具按钮...

    SWT和JFace开发实例

    - 使用TableViewer和TreeViewer实现数据展示和编辑。 - 创建自定义对话框,如使用Dialog和Shell类。 - 事件驱动编程,实现用户交互响应。 - 使用Action和Command模式进行命令管理,提高代码复用性。 - 实现文件...

    eclipse rcp 插件开发学习笔记.pdf 1-14章

    3. **第4章 使用基本控件与对话框**: - 学习如何创建和使用SWT的基本控件,如按钮、文本框、列表和树等。 - 掌握对话框的使用,包括消息对话框、输入对话框和文件选择对话框。 4. **第5章 容器与布局管理器**: ...

    SWT/JFace从入门到精通

    - 创建第一个SWT程序:创建一个简单的Hello, World程序,使用Shell作为顶级窗口,Button控件显示消息。 - 探索JFace:了解JFace如何简化SWT的使用,如利用TreeViewer和TableViewer展示数据。 - 练习MVC:通过创建...

    SWT,JFACE核心应用源代码,第二部分.rar

    3. 数据绑定:JFace的DataBinding机制允许开发者将模型数据与用户界面控件直接关联,实现数据的实时更新。 4. 视图和编辑器:研究如何定义和实现视图和编辑器,以及它们在Eclipse RCP(Rich Client Platform)中的...

    Eclipse Swt/Jface核心应用 (14-19章)

    第17章可能讲解了如何使用TableViewer和TreeViewer来显示和操作数据,包括排序、过滤、分页等高级功能。 7. **事件和监听器**:在GUI编程中,事件驱动模型是关键。第18章可能涉及SWT和JFace中的事件机制,包括添加...

    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 ...

    bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?

    Bootstrap-treeview是一个基于Bootstrap框架的jQuery多级列表树插件,它能够帮助开发者快速实现Web项目中的树形菜单功能。在开发中,我们经常需要通过树形结构展示数据,例如表示公司的组织架构、文件夹目录、网站...

    Eclipse Swt/Jface核心应用 (19-23章)

    5. **表和树视图**:第19章可能详细讲解如何使用TableViewer和TreeViewer创建数据驱动的视图。这些组件允许展示结构化的数据,并支持排序、过滤和自定义列。 6. **对话框和消息框**:Eclipse SWT提供了各种对话框,...

Global site tag (gtag.js) - Google Analytics