JTree

De ChuWiki


Creación de un JTree[editar]

Para crear un JTree usando las clases por defecto que nos ofrece java, debemos primero crear un DefaultTreeModel. A el le vamos añadiendo los distintos nodos que serán DefaultMutableTreeNode. Cada uno de estos admite un "user object" que puede ser lo que nosostros queramos que tenga ese nodo. En el JTree se mostrará la cadena de texto obtenida al llamar a "user object".toString().

Un ejemplo puede ser este

/**
 * Ejemplo de seleccion de nodos en un arbol
 */
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreePath;

/**
 * Crea un JTree y muestra lo que se selecciona en el.
 */

public class prueba extends JFrame {
	public static void main(String[] args) {
		
		// Creación de los datos para el JTree. Un padre, con hijo1 e hijo2. hijo1 tiene
		// ademas un nieto.
		DefaultMutableTreeNode padre = new DefaultMutableTreeNode(new Integer(3));
		DefaultMutableTreeNode hijo1 = new DefaultMutableTreeNode("hijo1");
		DefaultMutableTreeNode hijo2 = new DefaultMutableTreeNode("hijo2");
		DefaultMutableTreeNode nieto1 = new DefaultMutableTreeNode(new Float(2.2));
		DefaultTreeModel modelo = new DefaultTreeModel(padre);
		modelo.insertNodeInto(hijo1, padre, 0);
		modelo.insertNodeInto(hijo2, padre, 1);
		modelo.insertNodeInto(nieto1, hijo1, 0);
		
		// Creacion y visualizacion de la ventana
		JFrame v = new JFrame("arbolito");
		JTree arbol = new JTree(modelo);
		v.getContentPane().add(arbol);
		v.pack();
		v.setVisible(true);
		v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
	}

}

Determinar que nodo se ha seleccionado en el JTree[editar]

Para enterarnos de cuando se selecciona un nodo en el JTree y cual de ellos se ha seleccionado, necesitamos añadir un TreeSelectionListener. Del TreeSelectionEvent que nos pasen cuando se seleccione un nodo, podemos obtener la información del nodo seleccionado.

El siguiente código muestra esto

/**
 * Ejemplo de seleccion de nodos en un arbol
 */
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreePath;

/**
 * Crea un JTree y muestra lo que se selecciona en el.
 */

public class prueba extends JFrame {
	public static void main(String[] args) {
		
		// Creación de los datos para el JTree. Un padre, con hijo1 e hijo2. hijo1 tiene
		// ademas un nieto.
		DefaultMutableTreeNode padre = new DefaultMutableTreeNode(new Integer(3));
		DefaultMutableTreeNode hijo1 = new DefaultMutableTreeNode("hijo1");
		DefaultMutableTreeNode hijo2 = new DefaultMutableTreeNode("hijo2");
		DefaultMutableTreeNode nieto1 = new DefaultMutableTreeNode(new Float(2.2));
		DefaultTreeModel modelo = new DefaultTreeModel(padre);
		modelo.insertNodeInto(hijo1, padre, 0);
		modelo.insertNodeInto(hijo2, padre, 1);
		modelo.insertNodeInto(nieto1, hijo1, 0);
		
		// Creacion y visualizacion de la ventana
		JFrame v = new JFrame("arbolito");
		JTree arbol = new JTree(modelo);
		v.getContentPane().add(arbol);
		v.pack();
		v.setVisible(true);
		v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		// Nos suscribimos a la seleccion de un nodo en el arbol.
		arbol.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
		
			public void valueChanged(TreeSelectionEvent e) {
				
				// Obtenemos y escribimos en pantalla  el path seleccionado
				TreePath path = e.getPath();
				Object [] nodos = path.getPath();
				System.out.print("Path seleccionado: ");
				for (Object nodo: nodos)
					System.out.print (nodo.toString() + " | ");
				System.out.println("");
				
				// Mirando el ultimo nodo del path, sabemos qué nodo en concreto
				// se ha seleccionado.
				DefaultMutableTreeNode ultimoNodo = 
					(DefaultMutableTreeNode)nodos[nodos.length-1];
				
				// Por ejemplo, para ver si se ha seleccionado el "hijo1"...
				if (ultimoNodo.getUserObject().equals("hijo1"))
				{
					// Necesitamos el modeloSeleccion para saber si "hijo1" se ha
					// seleccionado o deseleccionado.
					DefaultTreeSelectionModel modeloSeleccion = 
						(DefaultTreeSelectionModel)e.getSource();
					if (modeloSeleccion.isPathSelected(path))
						System.out.println("Has seleccionado hijo 1");
					else
						System.out.println("Has deseleccionado hijo 1");
				}
			}
		
		});
	}

}

Determinar el nodo del JTree sobre el que se hace click[editar]

Cuando se hace click con el ratón sobre un nodo del JTree, podemos determinar en qué nodo se ha hecho click con el método getPathForLocation() o bien en qué fila del árbol con el método getRowForLocation()

El siguiente código, extraido y modificado de la API de JTree de Sun indica la forma de obtener el nodo sobre el que se ha hecho click.

JTree tree = ...;

MouseListener ml = new MouseAdapter() 
{
     public void mousePressed(MouseEvent e) 
     {
         // Se obtiene el path para esa fila. Con el path podemos obtener
         // los nodos.
         TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
         Object nodo = selPath.getLastPathComponent();

         ...
    }
};
tree.addMouseListener(ml);


Otros enlaces sobre JTree[editar]