Swing y JFC (Java Foundation Classes)

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.

.�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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR