SWT/Jface(4): TreeViewer渲染简单树对象

简介

TreeViewer提供了将树节点及数据集与树组件有机联系起来的机制和方法, 它的使用与表查看器非常相似,需要通过设置 input 属性设置树节点集,也需要设置内容提供器(ContentProvider)和标签提供器(LabelProvider)。

  1. input: 指定树的根节点。通过该根节点可以找到树的一级节点及其子节点。

  2. contentProvider: 设置树的内容提供器。内容提供器一般需要实现 ITreeContentProvider 接口,主要方法有:

    1. Object[] getElements ( Object inputElement )
      参数inputElementinput属性值,该方法返回显示
      在树中的节点元素数组。一般inputElement是树的根元素,返回的是一级元素。

    2. Object[] getChildren(Object parentElement)

      返回给定父袁术parentElement的子元素数组。

    3. Object getParent(Object element)

      返回元素element的父元素。

    4. boolean hasChildren(Object element)

      判断元素element是否存在子元素,有则返回true

    如果每个元素都是TreeNode对象,则该属性值可以设置为org.eclipse.jface.viewers.TreeNodeContentProvider类或其子类的对象,且只需覆盖getElements方法。

  3. lableProvider: 设置标签提供器。一般通过实现ILabelProvider接口设计标签提供器。该接口有两个主要方法:

    1. Image getlmage ( Object element )-﹣返回树节点元素 element 的图标。
    2. String getText ( Object element )-﹣返回树节点元素 element 的文字。

    可以使用org.eclipse.jface.viewers.LabelProvider类或其子类的实例。该类的默认实现getText方法返回参数elementtoString, getlmage返回null

  4. autoExpandLevel:设置初始显示时,树被自动展开的层数。

  5. sorter:设置树的排序器, 最新版本要使用void setComparator(ViewerComparator comparator)方法来进行设置,与表查看器的排序器设计思路和方法基本相同。

  6. useHashlookup:该属性设置为true,可以加快查找元素的速度。

示例

import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import java.util.Optional;

public class Study extends TreeNode {
    public String name;

    @Override
    public String toString() {
        return name;
    }

    public Study(String name, TreeNode... children) {
        super(name);
        this.name = name;
        setChildren(children);
    }

    private static Study[] studies() {
        Study s1 = new Study("《SWT从入门到放弃》");
        Study s2 = new Study("《死磕PyQt》");
        Study java = new Study("java", s1);
        Study python = new Study("python", s2);
        Study root = new Study("root", java, python);
        Study[] studies = {root, s1, s2, java, python};
        for (Study study : studies) {
            if (study.hasChildren()) {
                for (TreeNode child : study.getChildren()) {
                    Optional.ofNullable(child).ifPresent(it -> it.setParent(study));
                }
            }
        }
        return new Study[]{root};
    }


    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        // 创建TreeViewer
        TreeViewer treeViewer = new TreeViewer(shell, SWT.SINGLE | SWT.BORDER);
        treeViewer.setLabelProvider(new LabelProvider());
        treeViewer.setContentProvider(new TreeNodeContentProvider());
        treeViewer.setUseHashlookup(true);
        treeViewer.setAutoExpandLevel(10);
        treeViewer.setInput(Study.studies());
        treeViewer.setComparator(new ViewerComparator() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                return ((Study) e2).name.compareTo(((Study) e1).name);
            }
        });
        treeViewer.refresh();
        shell.setSize(200, 200);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

你可能感兴趣的:(swt学习,swt,jface,gui)