1. Tree
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);
代码
一个简单的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