SWT Tree和TreeViewer

By | 2018年4月7日

1. Tree

请参考Table的使用。

Tree和Table基本类似,唯一不同是TreeItem可以包含TreeItem,由此形成一个树。Table的那些Property,Tree也支持。

  • Tree就是树本身。
  • TreeColumn是树的一列。
  • TreeItem是一行数据,可以另一个TreeItem为parent创建新的TreeItem。
Tree tree = new Tree(parent, SWT.FULL_SELECTION | SWT.MULTI);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);

TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
column1.setText("Column1");

TreeColumn column2 = new TreeColumn(tree, SWT.NONE);
column2.setText("Column2");
        
TreeItem item1 = new TreeItem(tree, SWT.NONE);
item1.setText(new String[] {"a1", "b1"});

TreeItem item2 = new TreeItem(item1, SWT.NONE);
item2.setText(new String[] {"a2", "b2"});

TreeItem item3 = new TreeItem(item1, SWT.NONE);
item3.setText(new String[] {"a3", "b3"});

TreeItem item4 = new TreeItem(item3, SWT.NONE);
item4.setText(new String[] {"a4", "b4"});

TreeItem item5 = new TreeItem(item3, SWT.NONE);
item5.setText(new String[] {"a5", "b5"});

item1.setExpanded(true);
column1.pack();
column2.pack();

2. TreeViewer

TreeViewer是对Tree的封装,TreeViewerColumn是对TreeItem的封装。它的LabelProvider和EditingSupport和TableViewer一模一样,可以参考TableViewer的使用

唯一需要做的,就是ContentProvider需要实现ITreeContentProvider,来构成一个树形数据结构。

2.1. 构造ContentProvider

对于之前TableViewer的例子,只需要提供一个ITreeContentProvider,我们就可以在树中显示,让Student包含其它的Student。继承ArrayContentProvider,实现ITreeContentProvider。

private static class StudentTreeContentProvider extends ArrayContentProvider implements ITreeContentProvider {
    @Override
    public Object[] getChildren(Object parentElement) {
        return ((Student) parentElement).getStudents().toArray();
    }

    @Override
    public Object getParent(Object element) {
        return ((Student) element).getParent();
    }

    @Override
    public boolean hasChildren(Object element) {
        List students = ((Student) element).getStudents();
        return students != null && !students.isEmpty();
    }
}

2.2. 使用Table的LabelProvider和EditingSupport

直接使用TableViewer的LabelProvider和EditingSupport,就可以显示和编辑了。

2.3. 设置展开级别

默认是所有节点都隐藏,只显示第一级节点。

treeViewer.setAutoExpandLevel(2);

image

代码

一个简单的Tree:
https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/viewers/TreeUsage.java

仅仅ContentProvider不一样,LableProvider和EditingSupport都是TableViewer拿过来的:
https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/viewers/TreeViewerUsage.java

Category: SWT