简介
TreeViewer
提供了将树节点及数据集与树组件有机联系起来的机制和方法, 它的使用与表查看器非常相似,需要通过设置 input
属性设置树节点集,也需要设置内容提供器(ContentProvider
)和标签提供器(LabelProvider
)。
-
input
: 指定树的根节点。通过该根节点可以找到树的一级节点及其子节点。 -
contentProvider
: 设置树的内容提供器。内容提供器一般需要实现ITreeContentProvider
接口,主要方法有:-
Object[] getElements ( Object inputElement )
参数inputElement
是input
属性值,该方法返回显示
在树中的节点元素数组。一般inputElement
是树的根元素,返回的是一级元素。 -
Object[] getChildren(Object parentElement)
返回给定父袁术
parentElement
的子元素数组。 -
Object getParent(Object element)
返回元素
element
的父元素。 -
boolean hasChildren(Object element)
判断元素
element
是否存在子元素,有则返回true
。
如果每个元素都是
TreeNode
对象,则该属性值可以设置为org.eclipse.jface.viewers.TreeNodeContentProvider
类或其子类的对象,且只需覆盖getElements
方法。 -
-
lableProvider
: 设置标签提供器。一般通过实现ILabelProvider
接口设计标签提供器。该接口有两个主要方法:Image getlmage ( Object element )
-﹣返回树节点元素 element 的图标。String getText ( Object element )
-﹣返回树节点元素 element 的文字。
可以使用
org.eclipse.jface.viewers.LabelProvider
类或其子类的实例。该类的默认实现getText
方法返回参数element
的toString
,getlmage
返回null
。 -
autoExpandLevel
:设置初始显示时,树被自动展开的层数。 -
sorter
:设置树的排序器, 最新版本要使用void setComparator(ViewerComparator comparator)
方法来进行设置,与表查看器的排序器设计思路和方法基本相同。 -
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();
}
}