domingo, 10 de noviembre de 2013

Ejemplo JTree En Java

Otra semana de las largas y otra demora en publicar, sin embargo continúo con la secuencia de componentes Complejos Java Swing....

En esta ocasión vamos a trabajar con el JTree o también conocido como Arboles.... Realizaremos un ejemplo sencillo mostrando el procedimiento de creación y le daremos un uso simple sin mayores complicaciones.

Que es?

El Jtree es uno de los componentes complejos aveces mas dificiles de entender y por su  "grado de complejidad" muchas veces evitado por algunos....... representa un árbol jerárquico que podemos mostrar en nuestras aplicaciones, se compone de nodos a los que le podemos vincular eventos o acciones dependiendo de nuestras necesidades.

Para que sirve?

Un Jtree puede ser utilizado para muchas cosas, principalmente se utilizan para mostrar rutas de directorios, un ejemplo común lo vemos en nuestro computador (no importa cual sea el sistema operativo, desde que se pueda trabajar de forma gráfica), si ingresamos a un explorador de carpetas vemos el árbol de directorios que nos permite navegar mas facilmente.

Básicamente nos permiten representar estructuras de datos jerárquicas, cada elemento es un nodo al que le podemos definir su función y sus eventos independientes.

En Java podemos hacer casi cualquier cosa con este componente, sin embargo dependiendo de lo que necesitemos el grado de dificultad y los conocimientos en programación pueden variar.

El Ejemplo.

En esta ocasión y como es normal, vamos a hacer un ejemplo simple, no vamos a profundizar mucho en el componente, tan solo usaremos lo necesario para crear nuestro árbol y que se entienda su funcionamiento.

La aplicacion mostrará un árbol en el que evidenciaremos la estructura jerárquica con un directorio que representa la raíz, un directorio secundario que representa una rama y archivos independientes que representan las hojas.


Nuestra aplicación permitirá mostrar un JPanel diferente por cada archivo de nuestro árbol, esto nos será muy útil si queremos simular un explorador como el mostrado anteriormente, donde al seleccionar un directorio se muestra su contenido, adicionalmente veremos en un JTextArea la ruta de directorios recorrida......... Veamos

La Aplicación.

La Aplicación es muy simple, contaremos con una Clase Principal y una Clase Ventana, la primera clase sera desde donde realizamos el llamado a la ventana del sistema mostrada anteriormente...... veamos de forma rápida lo principal de nuestra clase....

Para crear el árbol además de utilizar obviamente la Clase JTree, también implementaremos la interface TreeSelectionListener, esta nos permitirá darle eventos a nuestros nodos (Mas adelante lo veremos).........
public class Ventana extends JFrame implements TreeSelectionListener {

Adicionalmente vamos a utilizar un JScrollPane donde almacenaremos nuestro árbol, esto es importante ya que si nuestro árbol es muy grande necesitamos un contenedor que permita su uso facilmente.
scrollPaneArbol = new JScrollPane();
scrollPaneArbol.setBounds(10, 80, 150, 130);
scrollPaneArbol.setViewportView(arbol);

Definimos un método crearArbol() el cual sera el encargado de contener todo lo necesario para la creación del árbol, la creación y vinculación de los nodos con los que vamos a trabajar.
private void crearArbol() {
/**Construimos los nodos del arbol que seran ramas u hojas*/
/**Definimos cual será el directorio principal o la raiz de nuestro arbol*/
  DefaultMutableTreeNode carpetaRaiz = new DefaultMutableTreeNode("Carpeta");
 /**Definimos el modelo donde se agregaran los nodos*/
  DefaultTreeModel modelo = new DefaultTreeModel(carpetaRaiz);
 /**agregamos el modelo al arbol, donde previamente establecimos la raiz*/
 arbol = new JTree(modelo);
 /**definimos los eventos*/
 arbol.getSelectionModel().addTreeSelectionListener(this);
        
 /**Definimos mas nodos del arbol y se lo agregamos al modelo*/
 DefaultMutableTreeNode carpeta2 = new DefaultMutableTreeNode("SubCarpeta");
 DefaultMutableTreeNode archivo1 = new DefaultMutableTreeNode("Archivo1");
 DefaultMutableTreeNode archivo2 = new DefaultMutableTreeNode("Archivo2");
 DefaultMutableTreeNode archivo3 = new DefaultMutableTreeNode("Archivo3");
 /**Definimos donde se agrega el nodo, dentro de que rama y que posicion*/
 modelo.insertNodeInto(carpeta2, carpetaRaiz, 0);
 modelo.insertNodeInto(archivo1, carpetaRaiz, 1);
 modelo.insertNodeInto(archivo2, carpetaRaiz, 2);

 /**Creamos las hojas del arbol*/
 DefaultMutableTreeNode archivo4 = new DefaultMutableTreeNode("Archivo4");
 DefaultMutableTreeNode archivo5 = new DefaultMutableTreeNode("Archivo5");
 DefaultMutableTreeNode archivo6 = new DefaultMutableTreeNode("Archivo6");
        
 modelo.insertNodeInto(archivo3, carpeta2, 0);
 modelo.insertNodeInto(archivo4, carpeta2, 1);
 modelo.insertNodeInto(archivo5, carpeta2, 2);
 modelo.insertNodeInto(archivo6, carpeta2, 3);
}

Como vemos para la creación de los nodos utilizamos la clase DefaultMutableTreeNode asi como una clase DefaultTreeModel el cual sera el modelo donde agregaremos cada uno de estos, definiendo allí la estructura de directorios y archivos con los que vamos a trabajar..... Vemos también la linea
arbol.getSelectionModel().addTreeSelectionListener(this);

donde vinculamos los eventos a nuestro árbol, esto gracias a que implementamos la interfaz TreeSelectionListener mencionada anteriormente.

Por ultimo utilizamos el método valueChanged() definido por la interfaz anterior, para implementar los eventos que necesitemos....
public void valueChanged(TreeSelectionEvent e) {

DefaultMutableTreeNode nodoSeleccionado;
nodoSeleccionad=(DefaultMutableTreeNode)arbol.getLastSelectedPathComponent();
eventosNodoSeleccionado(nodoSeleccionado);
 
 s+="Ruta: ";
 areaDeTexto.setText("\n");
 areaDeTexto.setText("hola");
 /**Obtenemos la ruta seleccionada*/
 TreePath rutaSeleccionada = e.getPath();
 Object [] nodos = rutaSeleccionada.getPath();
 for (int i = 0; i < nodos.length ; i++){
 Object nodo=nodos[i];
 s+=nodo.toString() + " / ";
 }
 s+="\n";
 areaDeTexto.setText(s);
}

En el método anterior usamos 2 maneras de capturar los eventos, la primera
usando el método getLastSelectedPathComponent() el cual nos permite obtener el nodo seleccionado, este se lo enviamos al método eventosNodoSeleccionado() que nos permitirá definir el panel asociado a nuestra selección.

La otra manera es mediante un objeto de tipo TreePath, este lo obtenemos usando el evento definido al momento de seleccionar un nodo, usando e.getpath() obtenemos la ruta completa de nuestra selección, esta ruta esta compuesta de los nodos de nuestro árbol, los cuales se almacenan en un arreglo de objetos que podemos recorrer y mostrarlos en el área de texto de nuestra aplicación.

Y una vez mas llegamos a un rápido final con un ejemplo simple que puede ser de mucha ayuda...........como se mencionó esta es una forma rápida y fácil de trabajar con nodos, espero mas adelante poder produndizar en este componente...... y espero que les pueda servir ;)

Descarga!!!

Les dejo el enlace de descarga por si lo quieren revisar ;).....está en Eclipse pero si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el... recuerden que es gratis, y nada cuesta opinar, compartir o agradecer :)


También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir y
 Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

21 comentarios:

  1. Buen día Ing. Henao.

    Estoy estudiando para Analista Programador, especializándome en Java (SE/EE), con la idea de certificarme en Oracle.

    He visto que estás creando posts sobre Swing, y te quería hacer una recomendación: Enseña JavaFX.

    JavaFX como el mismo Oracle a dicho, ha venido a reemplazar a Swing (Y creo que no está muy lejos, desde que FX se hizo también OpenSource, cada día aumenta la cantidad de desarrolladores que adoptan FX). Por lo que creo, que Swing, morirá en un futuro mediano-cercano (está claro que no lo separarán de Java, si no AWT ya hubiera desaparecido xD).

    FX es relativamente fácil de aprender, además, con la aparición de FXML y Scene Builder, la creación de GUI's ricas nunca fue tan fácil. Hay 2 opciones, crear la Interfaz gráfica manualmente (código Java) o crearla por medio de Scene Builder (diseñador GUI) que generará código FXML. Además puedes agregar CSS a tus GUI, haciendo que luzcan como desees.

    Espero te animes a echarle un ojo a FX!

    Saludos y felicitaciones por tu trabajo, sigue así.

    ResponderEliminar
    Respuestas
    1. Hola, Gracias por el mensaje y la recomendación, claro que la tendré en cuenta, tengo pensado mas adelante vincular JavaFx como tema a trabajar, por el momento estoy con Swing ya que aún es muy usado y es de lo basico que se enseña en las universidades por lo tanto hay mucha gente que trabaja con el, sin embargo en este campo siempre hay constantes actualizaciones y ese cambio que mencionas ya está llegando.....asi que me pondré en la tarea de seguir tu recomendación, espero mas adelante poderlo hacer ;)
      Un Saludo

      Eliminar
    2. Me parece excelente Ingeniero.

      Un saludo y gracias de nuevo por el blog, está espectacular =)

      Eliminar
    3. Ingeniero Cristian, podría hacerle una consulta?

      Podría hablar en futuras entradas sobre Threads, Sockets y Servlets y sobre programación 'Multihilo'?

      Son conceptos que creo a muchos no nos quedan bien claros. Gracias por su tiempo.

      Eliminar
    4. Hola, te cuento que el tema de hilos lo tengo pendiente cuando finalice esta secuencia, espero muy pronto poderlo vincular....... los otros temas no los tenia contemplados pero voy a revisar porque seria bueno introducirlos, te invito a participar en el sitio para que estes atento a los cambios, un saludo ;)

      Eliminar
  2. no encuentro el proyecto en la descarga solo hay carpetas

    ResponderEliminar
    Respuestas
    1. Hola Kevin, en la carpeta src estan los paquetes con las clases Java, verifica por favor y me cuentas, no se si depronto te refieras al ejecutable, por efectivamente ese no esta, tan solo estan las clases

      Eliminar
  3. estaria sensacional si hicieras un curso sobre como crear pdfs con itextPDF... saludos excelentes aportaciones :)

    ResponderEliminar
    Respuestas
    1. Hola Salvador, tengo pendiente el tema de reportes, pero voy a revisar itextPDF para ver si puedo mirar algo de el en el blog.......Muchas Gracias ;)

      Eliminar
  4. excelente codigo... !!

    ResponderEliminar
  5. Excelente amigo, tus codigos siempre son de mucha utilidad, me da pena molestarte, pero me podrias ayudar con un Jcombobox, Agradeceria inmensamente que hicieras un tutorial o me explicaras como puedo remover un item cuando sea selecciona y/o este en una tabla en el mismo Jframe

    De antemano muchas gracias y disculpa, tambien estudio analisis y diseño de sistemas de información en el Sena de Cali

    ResponderEliminar
    Respuestas
    1. Hola, que pena la hora pero he estado medio apretado de tiempo.....no te entendí bien como seria el ejemplo? quitar un item de un combo apenas se seleccione? demás que ya lo solucionaste pero si algo me avisas...................pdta: excelente, el valle tiene muy buen nivel........yo ahora soy instructor ADSI en el Quindio :)

      Eliminar
  6. Hola Cristian...es posible crear un buscador de carpetas donde yo determine la carpeta que quiero buscar sin usar el explorador sino escribiendo el nombre de la carpeta?... muchas gracias

    ResponderEliminar
  7. Hola Cristian...es posible crear un buscador de carpetas donde yo determine la carpeta que quiero buscar sin usar el explorador sino escribiendo el nombre de la carpeta?... muchas gracias

    ResponderEliminar
  8. Hola Cristian podrias pasarme el codigo fuente de este ejemplo, me gustaria verlo para ver como funciona.
    Gracias.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Cristian, como puedo agregar nuevos nodos (carpetas y/o archivos), seleccionando una carpeta ya existente, agregándolas con botones?

    ResponderEliminar
  11. Cristian dejame felicitarte porque tus tutoriales de Swing me parecen excelentes, muy didacticos y bien explicados. Que bueno que pongas a disposición de las personas tu conocimiento y contribuyas a que este se difunda libremente.

    ResponderEliminar
  12. Hola podrias decirme como se hace para poner la consola de cmd en java o un frame
    Lo que pasa es quiero hacer mi propio editor
    Depido a que la mayoria de ellos no cumple
    Con los requisitos que yo quisiera para poder abanzar mas rapido.

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!