# 如何编写树选择监听器

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/events/treeselectionlistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/treeselectionlistener.html)

要检测用户何时选择[树](../components/tree.html)中的节点，您需要注册树选择监听器。这是一个例子，取自[响应节点选择](../components/tree.html#select)中讨论的`TreeDemo`示例，检测树中的节点选择，该树中一次最多只能选择一个节点：

```
tree.addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                           tree.getLastSelectedPathComponent();

   /* if nothing is selected */ 
        if (node == null) return;

   /* retrieve the node that was selected */ 
        Object nodeInfo = node.getUserObject();
        ...
    /* React to the node selection. */
        ...
    }
});

```

要指定树应支持单选，程序将使用以下代码：

```
tree.getSelectionModel().setSelectionMode
        (TreeSelectionModel.SINGLE_TREE_SELECTION);

```

`TreeSelectionModel`接口为选择模式定义了三个值：

`DISCONTIGUOUS_TREE_SELECTION`

This is the default mode for the default tree selection model. With this mode, any combination of nodes can be selected.

`SINGLE_TREE_SELECTION`

This is the mode used by the preceding example. At most one node can be selected at a time.

`CONTIGUOUS_TREE_SELECTION`

With this mode, only nodes in adjoining rows can be selected.

_ 因为`TreeSelectionListener`只有一个方法，所以它没有相应的适配器类。_

| 方法 | 目的 |
| :-- | :-- |
| [valueChanged（TreeSelectionEvent）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionListener.html#valueChanged-javax.swing.event.TreeSelectionEvent-) | 每当选择改变时调用。 |

| 方法 | 目的 |
| :-- | :-- |
| [对象 getSource（）](https://docs.oracle.com/javase/8/docs/api/java/util/EventObject.html#getSource--)
（`java.util.EventObject` 中的 _）_ | 返回触发事件的对象。 |
| [TreePath getNewLeadSelectionPath（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#getNewLeadSelectionPath--) | 返回当前的潜在客户路径。 |
| [TreePath getOldLeadSelectionPath（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#getOldLeadSelectionPath--) | 返回先前引导路径的路径。 |
| [TreePath getPath（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#getPath--) | 返回第一个路径元素。 |
| [TreePath [] getPaths（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#getPaths--) | 返回已从选择中添加或删除的路径。 |
| [boolean isAddedPath（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#isAddedPath--) | 如果已将第一个路径元素添加到选择中，则返回 true。如果已从选择中删除第一个路径，则返回 false。 |
| [boolean isAddedPath（int）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#isAddedPath-int-) | 如果索引指定的路径已添加到选择中，则返回 true。 |
| [boolean isAddedPath（TreePath）](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionEvent.html#isAddedPath-javax.swing.tree.TreePath-) | 如果指定的路径已添加到选择中，则返回 true。 |
| [Object getLastSelectedPathComponent（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.html#getLastSelectedPathComponent--) | 返回当前选择的第一个节点中的最后一个路径组件。 |
| [TreePath getLeadSelectionPath（）](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTree.html#getLeadSelectionPath--)
（`JTree` 中的 _）_ | 返回当前的潜在客户路径。 |

下表列出了使用树选择侦听器的示例。

| 例 | 在哪里描述 | 笔记 |
| :-- | :-- | :-- |
| [`TreeDemo`](../examples/components/index.html#TreeDemo)
 | [如何使用树木](../components/tree.html) | 树监听器通过显示相应的 HTML 文档来响应节点单击。 |