## Cómo Utilizar Trees

Con la clase JTree, puedes mostrar datos en forma de árbol. JTree realmente no contiene tus datos, simplemente es una vista de ellos. Aquí tienes una imagen de una árbol:

Como muestra la imagen anterior, JTree muestra sus datos verticalmente. Cada fila contiene exactamente un ítem de datos [llamado nodo). Cada árbol tiene un nodo raiz [llamado Root en la figura anterior] del que descienden todos los nodos. Los nodos que no pueden tener hijso se llaman nodos hoja. En la figura anterior se marcan los nodos hoja con un círculo.

Los nodos que no son hojas pueden tener cualquier número de hijos, o incluso ninguno. En la imagen superior los estos nodos están representados por una carpeta. Normalmente el usuario podrá expandir y contraer los nodos que non hojas -- haciendo que sus hijos sean visibles o invisibles. Por defecto estos nodos arrancas contraidos.

Cuando inicializas un Tree, creas un ejemplar de TreeNode para cada uno de los nodos. Incluyendo el raíz. Para hacer un nodo hoja, llama a su método setAllowsChildren(false).

Cuando los datos cambian -- por ejemplo, se añaden nodos -- puedes permitir que JTree[Model?] sepan que hay nuevos datos incocando uno de los métodos de TreeModelListener. Entonces JTree muestra los nuevos datos.

Aquí tienes un gráfico de una aplicación que muestra el tree en un Scroll Pane:

> Intenta esto:
> 1. Compila y ejecuta la aplicación. El fichero fuente está en TreeDemo.java.
>    Puedes ver la página Getting Started with Swing si necesitas ayuda.
> 2. Expande un nodo.
>    Si estás utilizando una Máquina virtual básica, puedes hacer esto pulsado el signo + que hay a la izquierda del ítem.
> 3. Selecciona un nodo.
>    Si estás utilizando una Máquina virtual básica, puedes hacer esto pulsado el texto del nodo o el icono que hay a la izquierda.

abajo tienes el código de TreeDemo.java que implementa el árbol del ejemplo anterior.

>     //en el código de inicialización de JPanel:
>         //Crea los nodos.
>         TreeNode top = new TreeNode("The Java Series");
>         TreeNode category;
>         TreeNode book;

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

>         //Tutorial
>         book = new TreeNode("The Java Tutorial: Object-Oriented Programming for the Internet");
>         book.add(new TreeNode("Mary Campione"));
>         book.add(new TreeNode("Kathy Walrath"));
>         category.add(book);

>         ...//hacer lo mismo para cad libro...

>         category = new TreeNode("Books for Java Implementers");
>         top.add(category);

>         //VM
>         book = new TreeNode("The Java Virtual Machine Specification");
>         book.add(new TreeNode("Tim Lindholm"));
>         book.add(new TreeNode("Frank Yellin"));
>         category.add(book);

>         //Liberar todos los nodos sin hijos.
>         makeLeaves(top);

>         JTree tree = new JTree(top);
>     . . .
>     //Este método se añadirá al API de TreeNode API en una futura versión.
>     protected void makeLeaves(TreeNode top) {
>         Enumeration       childEnum = top.preorderEnumeration();
>         TreeNode          descendant;

>         while(childEnum.hasMoreElements()) {
>             descendant = (TreeNode)childEnum.nextElement();
>             if(descendant.getChildCount() == 0)
>                 descendant.setAllowsChildren(false);
>         }
>     }

Ozito