Iconos en un JTree

   En la entrada "Los JTree" veiamos un ejemplo sencillo de como implementar nodos y leer sus eventos, también dije que poco a poco iré explicando otros tips acerca de esto, y es porque los árboles son parte escencial en una aplicación de edición rápida para un usuario.

   Continuando lo que debemos saber es la forma en que trabaja el renderizado (la forma en que se pintan los componentes). Para el renderizado los árboles tienen su propio método el cual es "TreeCellRenderer()", a partir del cual se crea una clase para pasarle por dato las imágenes y valores que tendría ese componente.

   Pero si no tenemos dicha clase definida entonces el componente toma por defecto la suya propia y la implementa, pues en pocas palabras tenemos como especie oculta un "DefaultTreeCellRenderer()", sabiendo esto entonces trabajaremos sobre la clase por defecto en vez de construir una propia para pasarle dichos valores (los iconos que queremos que tenga).

   Esto es válido siempre y cuando queramos modificar únicamente los iconos, sino tendremos que crearnos nuestra propia clase para cambiar otros parámetros, por lo que una vez hecho el cast (conversión) de la clase por defecto a la definida lo que hacemos es pasar los parametros.

DefaultTreeCellRenderer iconos = (DefaultTreeCellRenderer)arbol.getCellRenderer();

setLeafIcon() para cambiar el icono de los nodos hoja (nodos sin hijos).
setOpenIcon() para cambiar el icono de los nodos con hijos que están desplegados (sus hijos son visibles).
setClosedIcon() para cambiar el icono de los nodos con hijos que están cerrados (los hijos no son visibles).

   De modo que siguiendo lo anterior quedaría un código como el siguiente:
import javax.swing.*;
import java.awt.event.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

@SuppressWarnings("deprecation")
public class IconoArbol extends JFrame {
 DefaultMutableTreeNode A1 = new DefaultMutableTreeNode("Abuelo");
 DefaultMutableTreeNode P1 = new DefaultMutableTreeNode("Padre1");
 DefaultMutableTreeNode P2 = new DefaultMutableTreeNode("Padre2");
 DefaultMutableTreeNode H1a = new DefaultMutableTreeNode("Hijo1");
 DefaultMutableTreeNode H2a = new DefaultMutableTreeNode("Hijo2");
 DefaultMutableTreeNode H3a = new DefaultMutableTreeNode("Hijo3");
 DefaultMutableTreeNode H1b = new DefaultMutableTreeNode("Hijo1");
 DefaultMutableTreeNode H2b = new DefaultMutableTreeNode("Hijo2");
 DefaultMutableTreeNode H3b = new DefaultMutableTreeNode("Hijo3");
 JTree arbol = new JTree(A1);
 JTextArea mensajes = new JTextArea(10,35);
 JScrollPane scroll = new JScrollPane(mensajes);
 JPanel panel = new JPanel();
 DefaultTreeCellRenderer iconos = (DefaultTreeCellRenderer)arbol.getCellRenderer();

 public IconoArbol() {
  super("Arboles");
  setLocation(100,100);
  setSize(430,400);
  iconos.setLeafIcon(new ImageIcon("la_imagen_normal"));
  iconos.setOpenIcon(new ImageIcon("la_imagen_abierta"));
  iconos.setClosedIcon(new ImageIcon("la_imagen_cerrada"));
  add(panel);
  A1.add(P1);
  A1.add(P2);
  P1.add(H1a);
  P1.add(H2a);
  P1.add(H3a);
  P2.add(H1b);
  P2.add(H2b);
  P2.add(H3b);
  panel.add(arbol);
  panel.add(scroll);
  arbol.addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent evt) {
     mensajes.append("Has seleccionado el nodo: "+
     evt.getPath().getLastPathComponent()+
     " en la carpeta: "+evt.getPath()+"\n");
    }
  });
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
 }

 public static void main(String[] arg) {
  JOptionPane.showMessageDialog(null,"Iconos de un JTree...\n");
  JOptionPane.showMessageDialog(null,"By Carlitox ("+
   "http://calitoxenlaweb.blogspot.com)");
  new IconoArbol();
 }
}
   Lo importante es saber de donde se cargan los componentes y aplicar los valores antes de agregarlos al panel principal.


Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión