树是可以显示分层信息的列表。树支持应用程序的扩展和折叠层次结构的中间级别的能力。
因为树常常显示分层结构,所以应该给它们提供一个数据模型供它们使用(在谈论 JFace 时,我将再次提到这个模型概念)。为此,在我们的例子中使用了内部类 Node,如清单 7 所示。
清单 7. 树模型的类节点
1 public class Node {
2 protected java.util.List children;
3 public java.util.List getChildren() {
4 return children;
5 }
6 public void setChildren(java.util.List children) {
7 this.children = children;
8 }
9 public void addChild(Node node) {
10 children.add(node);
11 }
12 protected String name;
13 public String getName() {
14 return name;
15 }
16 public void setName(String name) {
17 this.name = name;
18 }
19 public Node(String name) {
20 this(name, new ArrayList());
21 }
22 public Node(String name, java.util.List children) {
23 setName(name);
24 setChildren(children);
25 }
26 }
27
2 protected java.util.List children;
3 public java.util.List getChildren() {
4 return children;
5 }
6 public void setChildren(java.util.List children) {
7 this.children = children;
8 }
9 public void addChild(Node node) {
10 children.add(node);
11 }
12 protected String name;
13 public String getName() {
14 return name;
15 }
16 public void setName(String name) {
17 this.name = name;
18 }
19 public Node(String name) {
20 this(name, new ArrayList());
21 }
22 public Node(String name, java.util.List children) {
23 setName(name);
24 setChildren(children);
25 }
26 }
27
要创建树,首先要创建树控件,然后添加 TreeItems 中包装的字符串数据。TreeItems 可以包含其他 TreeItems,这样就可以创建值的层次结构。清单 8 创建了图 7 中所示的树。
清单 8. 使用 helper 方法创建树
1 // Create the Tree
2 protected Tree createTree(Composite parent, int mode, Node root) {
3 tree = new Tree(parent, mode | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
4 tree.addSelectionListener(new SelectionListener() {
5 :
6 });
7 setTreeContents(root);
8 return tree;
9 }
10 protected void setTreeContents(Node root) {
11 tree.removeAll();
12 TreeItem ti = new TreeItem(tree, SWT.NONE);
13 setTreeItemContents(ti, root);
14 }
15 protected void setTreeItemContents(TreeItem ti, Node root) {
16 ti.setText(root.getName());
17 java.util.List children = root.getChildren();
18 if (children != null && children.size() > 0) {
19 for (Iterator i = children.iterator(); i.hasNext();) {
20 Node n = (Node)i.next();
21 TreeItem tix = new TreeItem(ti, SWT.NONE);
22 setTreeItemContents(tix, n);
23 }
24 }
25 }
26 :
27 // sample creation code
28 protected void addChildren(Node n, int count, int depth, String prefix) {
29 if (depth > 0) {
30 for (int i = 0; i < count; i++) {
31 String name = prefix + '.' + i;
32 Node child = new Node(name);
33 n.addChild(child);
34 addChildren(child, count, depth - 1, name);
35 }
36 }
37 }
38 Node root = new Node("<root>");
39 addChildren(root, 3, 3, "Child");
40 tree = createTree(this, SWT.CHECK, root);
41
2 protected Tree createTree(Composite parent, int mode, Node root) {
3 tree = new Tree(parent, mode | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
4 tree.addSelectionListener(new SelectionListener() {
5 :
6 });
7 setTreeContents(root);
8 return tree;
9 }
10 protected void setTreeContents(Node root) {
11 tree.removeAll();
12 TreeItem ti = new TreeItem(tree, SWT.NONE);
13 setTreeItemContents(ti, root);
14 }
15 protected void setTreeItemContents(TreeItem ti, Node root) {
16 ti.setText(root.getName());
17 java.util.List children = root.getChildren();
18 if (children != null && children.size() > 0) {
19 for (Iterator i = children.iterator(); i.hasNext();) {
20 Node n = (Node)i.next();
21 TreeItem tix = new TreeItem(ti, SWT.NONE);
22 setTreeItemContents(tix, n);
23 }
24 }
25 }
26 :
27 // sample creation code
28 protected void addChildren(Node n, int count, int depth, String prefix) {
29 if (depth > 0) {
30 for (int i = 0; i < count; i++) {
31 String name = prefix + '.' + i;
32 Node child = new Node(name);
33 n.addChild(child);
34 addChildren(child, count, depth - 1, name);
35 }
36 }
37 }
38 Node root = new Node("<root>");
39 addChildren(root, 3, 3, "Child");
40 tree = createTree(this, SWT.CHECK, root);
41
图 7. 树的例子

复选框是可选的。