## Cómo usar Trees

Con la clase JTree, se puede mostrar un árbol de datos. JTree realmente no contiene datos, simplemente es un vista de ellos. Aquí tienes una imagen de un árbol:

Como muestra la figura anterior, JTree muestra los datos verticalmente. Cada fila contiene exactamente un ítem de datos (llamado un nodo). Cada árbol tiene un nodo raíz (llamado Root en la figura anterior, del que descienden todos los nodos. Los nodos que no pueden tener hijos se llaman nodos leaf (hoja). En la figura anterior, el aspecto-y-comportamiento marca los nodos hojas con un círculo.

Los nodos que no sean hojas pueden tener cualquier número de hijos, o incluso no tenerlos. En la figura anterior, el aspecto-y-comportamiento marca los nodos que no son hojas con un carpeta. Normalmente el usuario puede expandir y contraer los nodos que no son hojas -- haciendo que sus hijos sena visibles o invisibles -- pulsando sobre él. Por defecto, los nodos que no son honas empiezan contraidos.

Cuando se inicializa un árbo, se crea un ejemplar de TreeNode para cada nodo del árbol, incluyendo el raíz. Cada nodo que no tenga hijos es una hoja. Para hacer que un nodo sin hijos no sea una hoja, se llama al método setAllowsChildren(true) sobre él.

El resto de esta página explica los siguientes tópicos:

- Crear un árbol que reaccione a las selecciones
- Personalizar la visualización del árbol.
- Cambiar dinámicamente un árbol.

#### Crear un Árbol que Reaccione a las Selecciones

> Aquí hay una imagen de una aplicación, en cuya mitad superior se muestra un árbol en un scroll pane.

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente es TreeDemo.java.
> 2. Expande un nodo
>    Puedes hacer esto pulsando sobre el círculo que hay a la izquierda del ítem.
> 3. Selecciona un nodo.
>    Puedes hacer esto pulsando sobre el texto del nodo o el icono que hay justo a la izquierda. El fichero mostrada en la parte inferior de la ventana muestra un fichero que refleja el estado actual del nodo seleccionado.

> Abajo tenemos el código TreeDemo.java que implementa el árbol del ejemplo anterior:

>     public TreeDemo() {
>         ...
>         //Crea los nodos.
>         DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java Series");
>         createNodes(top);

>         //Crea un árbol que permite una selección a la vez.
>         JTree tree = new JTree(top);
>         tree.getSelectionModel().setSelectionMode
>                 (TreeSelectionModel.SINGLE_TREE_SELECTION);

>         //Escucha cuando cambia la selección.
>         tree.addTreeSelectionListener(new TreeSelectionListener() {
>             public void valueChanged(TreeSelectionEvent e) {
>                 DefaultMutableTreeNode node = (DefaultMutableTreeNode)
>                                    (e.getPath().getLastPathComponent());
>                 Object nodeInfo = node.getUserObject();
>                 if (node.isLeaf()) {
>                     BookInfo book = (BookInfo)nodeInfo;
>                     displayURL(book.bookURL);
>                 } else {
>                     displayURL(helpURL);
>                 }
>             }
>         });

>         //Crea el scroll pane y le añade el árbol.
>         JScrollPane treeView = new JScrollPane(tree);
>         ...
>         //Añade los scroll panes a un split pane.
>         JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
>                                               treeView, htmlView);
>         ...
>     }

>     private class BookInfo {
>         public String bookName;
>         public URL bookURL;

>         public BookInfo(String book, String filename) {
>             bookName = book;
>             ...//Set bookURL...
>         }

>         //Esto es lo que se mostrará en el árbol.
>         public String toString() {
>             return bookName;
>         }
>     }
>     ...
>     private void createNodes(DefaultMutableTreeNode top) {
>         DefaultMutableTreeNode category = null;
>         DefaultMutableTreeNode book = null;

>         category = new DefaultMutableTreeNode("Books for Java Programmers");
>         top.add(category);

>         //Tutorial
>         book = new DefaultMutableTreeNode(new BookInfo
>             ("The Java Tutorial: Object-Oriented Programming for the Internet",
>             "tutorial.html"));
>         category.add(book);
>         ...
>         category = new DefaultMutableTreeNode("Books for Java Implementers");
>         top.add(category);

>         //VM
>         book = new DefaultMutableTreeNode(new BookInfo
>             ("The Java Virtual Machine Specification",
>              "vm.html"));
>         category.add(book);

>         //Language Spec
>         book = new DefaultMutableTreeNode(new BookInfo
>             ("The Java Language Specification",
>              "jls.html"));
>         category.add(book);
>     }

#### Personalizar la visualización de un Árbol

> Un árbol usa un unico renderizador para dibujar todos sus nodos. Por defecto, este renderizador es un ejemplar de DefaultTreeCellRenderer.

> Se puede personalizar fácilmente la forma en que DefaultTreeCellRenderer dibuja los nodos. Por ejemplo, contiene métodos que permiten seleccionar los iconos usados para los nodos del árbol. Para personalizar el renderizador, sólo debemos crear un ejemplar de DefaultTreeCellRenderer, llamar a alguno de sus métodos setXxx, y luego hacer que el ejemplar sea el renderizador del árbol. La siguiente figura muestra una aplicación que ha cambiado su renderizador como que use un icono de hoja personalizado.

> Aquí está el código que seleccion el icono (el programa completo es TreeIconDemo.java):

>     DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
>     renderer.setLeafIcon(new ImageIcon("images/middle.gif"));
>     tree.setCellRenderer(renderer);

#### Cambiar Dinámicamente un Árbol

> La siguiente figura muestra una aplicación que nos permite añadir nodos al árbol de forma dinámica. También podemos editar el texto de cada nodo.

> Puedes encontrar el código en DynamicTreeDemo.java y DynamicTree.java.

Ozito