# 如何编写 Tree-Will-Expand 监听器 > 原文: [https://docs.oracle.com/javase/tutorial/uiswing/events/treewillexpandlistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/treewillexpandlistener.html) _tree-will-expand_ 监听器可防止[树](../components/tree.html)节点扩展或折叠。要在发生扩展或崩溃后*立即通知*,您应该使用*树扩展监听器*。 该演示将一个 tree-will-expand 监听器添加到[如何编写树扩展监听器](treeexpansionlistener.html)中讨论的`TreeExpandEventDemo`示例中。这里添加的代码演示了 _tree-will-expand_ 监听器可以防止节点扩展和崩溃:每次尝试扩展节点时,监听器都会提示您进行确认。 ![TreeExpandEventDemo2.html](img/5357a95d28cdec4be83498615414064d.jpg) * * * **Try this:**  1. 单击“启动”按钮以使用 [Java™Web Start](http://www.oracle.com/technetwork/java/javase/javawebstart/index.html) ([下载 JDK 7 或更高版本](http://www.oracle.com/technetwork/java/javase/downloads/index.html))运行 TreeExpandEventDemo2。或者,要自己编译并运行示例,请参考[示例索引](../examples/events/index.html#TreeExpandEventDemo2)。 [![Launches the TreeExpandEventDemo2 example](img/4707a69a17729d71c56b2bdbbb4cc61c.jpg)](https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TreeExpandEventDemo2Project/TreeExpandEventDemo2.jnlp) 2. 单击 **Potrero Hill** 节点左侧的图形。这告诉树您要扩展节点。 出现一个对话框,询问您是否确实要扩展节点。 3. 单击“展开”或关闭对话框。 文本区域中的消息告诉您发生了 tree-will-expand 事件和树扩展事件。在每条消息的末尾是扩展节点的路径。 4. 尝试展开另一个节点,但这次按对话框中的“取消扩展”按钮。 节点不扩展。文本区域中的消息告诉您发生了 tree-will-expand 事件,并且您取消了树扩展。 5. 折叠 **Potrero Hill** 节点。 节点在没有出现对话框的情况下折叠,因为事件处理器的`treeWillCollapse`方法允许崩溃发生,无争议。 * * * 以下代码段显示了此程序添加到`TreeExpandEventDemo`的代码。粗线可防止树扩展。您可以在 [`TreeExpandEventDemo2.java`](../examples/events/TreeExpandEventDemo2Project/src/events/TreeExpandEventDemo2.java) 中找到所有演示的源代码。 ```java public class TreeExpandEventDemo2 ... { ... class DemoArea ... implements ... TreeWillExpandListener { ... public DemoArea() { ... tree.addTreeWillExpandListener(this); ... } ... //Required by TreeWillExpandListener interface. public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException { saySomething("Tree-will-expand event detected", e); //...show a dialog... if (/* user said to cancel the expansion */) { //Cancel expansion. saySomething("Tree expansion cancelled", e); throw new ExpandVetoException(e); } } //Required by TreeWillExpandListener interface. public void treeWillCollapse(TreeExpansionEvent e) { saySomething("Tree-will-collapse event detected", e); } ... } } ``` _`TreeWillExpandListener`没有适配器类。_ | 方法 | 目的 | | :-- | :-- | | [treeWillCollapse(TreeExpansionEvent)](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeWillExpandListener.html#treeWillCollapse-javax.swing.event.TreeExpansionEvent-) | 在树节点崩溃之前调用。为了防止崩溃,您实现此方法应该抛出 [`ExpandVetoException`](https://docs.oracle.com/javase/8/docs/api/javax/swing/tree/ExpandVetoException.html) 事件。 | | [treeWillExpand(TreeExpansionEvent)](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeWillExpandListener.html#treeWillExpand-javax.swing.event.TreeExpansionEvent-) | 在树节点扩展之前调用。为防止发生扩展,此方法的实现应抛出 [`ExpandVetoException`](https://docs.oracle.com/javase/8/docs/api/javax/swing/tree/ExpandVetoException.html) 事件。 | 有关前面方法的 [`TreeExpansionEvent`](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeExpansionEvent.html) 参数的信息,请参见[树扩展事件 API](treeexpansionlistener.html#api) 。 本节中介绍的 [`TreeExpandEventDemo2`](../examples/events/index.html#TreeExpandEventDemo2) 是我们使用 tree-will-expand 监听器的唯一示例。