1 NIVEL 16: ESTRUCTURAS RECURSIVAS N-ARIAS JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 2 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 3 ¿Qué es? • Componente gráfico SWING • Clase para desplegar un conjunto de datos de manera jerárquica ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 4 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 5 Conceptos Tiene una raíz La información se despliega de manera vertical Una rama tiene uno o más hijos Una hoja no tiene hijos Cada fila es un nodo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 6 Conceptos • TreePath: Camino a un nodo • Encapsula un nodo y todos sus antecesores • “./Root/Numbers/One” • ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 7 Conceptos • Un nodo colapsado oculta sus hijos. • Un nodo escondido está debajo de un ancestro colapsado. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 8 Conceptos • Un nodo expandido no es una hoja y se identifica mediante: TreeModel.isLeaf(node) retornando false ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 9 Conceptos • Todos los nodos padres visibles están expandidos, pero pueden o no estar desplegados. • Un nodo desplegado es un nodo visible y está en el área de visualización ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 10 Conceptos • Métodos de JTree para saber si el nodo está desplegado: • • • • • • isRootVisible() setRootVisible() scrollPathToVisible() scrollRowToVisible() getVisibleRowCount() setVisibleRowCount() ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 11 Conceptos • Métodos de JTree para saber si el nodo es visible (bajo un nodo expandido): • • isVisible() makeVisible() ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 12 Conceptos • Los nodos del árbol son objetos de la clase DefaultMutableTreeNode • Implementan la interfaz TreeNode ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Conceptos 13 JTree Representación física sobre la pantalla Modelo getModel( ) Clase: DefaultTreeModel Interfaz: TreeModel ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Conceptos 14 JTree Representación física sobre la pantalla Un cambio en el Modelo, genera un evento que hace que el JTree realice las actualizaciones necesarias en la representación visible del árbol. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Modelo 15 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 16 Creación de un JTree • Se declara como un atributo en la clase del panel que va a incluir el árbol. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 17 Creación de un JTree • Se crea el nodo constructor ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co raíz (raiz) en el método 18 Creación de un JTree • Se crea el árbol a partir de la raíz previamente creada en el método constructor. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 19 Creación de un JTree • Se crea un JScrollPane y se asocia al árbol en el método constructor. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 20 Creación de un JTree • Resultado: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 21 Creación de un JTree • Creación de los demás nodos en el constructor ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 22 Creación de un JTree • Se crean variables para los nuevos nodos ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 23 Creación de un JTree • Se crea un nodo “Categoría” y se agrega a la raíz del árbol. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 24 Creación de un JTree • Se crea un nodo “Libro” y se agrega a la “Categoría” ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 25 Creación de un JTree • ¿Qué hay en el constructor de un nodo? Raíz del árbol Objetos de la clase Object Nodo “categoria”: es hijo directo de la raíz del árbol Nodo “libro”: es hijo de un nodo categoria ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 26 Creación de un JTree • ¿Qué hay en el constructor de un nodo? Raíz del árbol String ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 27 Creación de un JTree • ¿Qué hay en el constructor de un nodo? Nodo “categoria”: es hijo directo de la raíz del árbol ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co String 28 Creación de un JTree • ¿Qué hay en el constructor de un nodo? Libro se muestra según el método toString() Nodo “libro”: es hijo de un nodo categoria ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 29 Creación de un JTree • Resultado: Raíz del árbol Nodos “Libro” Nodos “Categoría” ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 30 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 31 Personalización • Diferentes estilos de presentación Estilo Java (por defecto) Estilo Windows UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 32 Personalización • Los íconos personalizados se definen en el constructor del panel que contiene el JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 33 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 34 Selección de nodos • Para expandir o colapsar los nodos de un JTree no necesario programar nada, Java lo hace solo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 35 Selección de nodos • Tratar el evento de selección de nodos: • Si al seleccionar un nodo se quiere hacer algo más que expandir o colapsar, hay que programarlo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 36 Selección de nodos • Tratar el evento de selección de nodos: • Hay que habilitar al panel para que “oiga” los eventos de selección del árbol. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 37 Selección de nodos • Tratar el evento de selección de nodos: • Decir al árbol que es el panel el que va a recibir el evento. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 38 Selección de nodos • Tratar el evento de selección de nodos: • Implementar en el panel el método valueChanged() ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 39 Selección de nodos • Resulta: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 40 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 41 Actualización dinámica del árbol JTree Representación física sobre la pantalla Un cambio en el Modelo, genera un evento que hace que el JTree realice las actualizaciones necesarias en la representación visible del árbol. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Modelo Clase: DefaultTreeModel Interfaz: TreeModel 42 Actualización dinámica del árbol • Se pueden invocar métodos sobre el modelo (DefaultTreeModel) para modificarlo: • • • insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index) removeNodeFromParent(MutableTreeNo de node) nodeRoot(TreeNode node) • Es necesario crear un DefaultTreeModel propio, con su propio listener. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 43 Actualización dinámica del árbol • Creación de un DefaultTreeModel ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co propio 44 Actualización dinámica del árbol • Este modelo debe tener su propio listener para detectar cuándo se modifica ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 45 Actualización dinámica del árbol • El JTree se crea usando ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co nuestro propio modelo 46 Actualización dinámica del árbol • Sobre este modelo es posible efectuar cambios dinámicamente ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 47 Actualización dinámica del árbol • Resultado: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 48 Actualización dinámica del árbol • Ejemplo: • ¿Qué es? ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Este modelo debe tener su propio listener para detectar cuándo se modifica 49 • Ejemplo: • Una clase propia que implementa la interfaz Este modelo debe TreeModelListener. tener su propio listener para detectar cuándo se modifica ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 50 • Ejemplo de TreeModelListener propio: Es necesario implementar TODOS los métodos de la interfaz, aunque sean vacíos ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 51 • Ejemplo de TreeModelListener propio: Respuesta a la modificación de un nodo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 52 • Ejemplo de TreeModelListener propio: Respuesta a la inserción de un nuevo nodo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 53 • Ejemplo de TreeModelListener propio: Respuesta a la eliminación de un nodo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 54 • Ejemplo de TreeModelListener propio: Respuesta a la modificación de la estructura del árbol ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 55 • Ejemplo de TreeModelListener propio: • Nuevo método treeNodesChanged(TreeModelEvent e) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 56 Actualización dinámica del árbol • Clase TreeModelEvent: ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 57 Actualización dinámica del árbol • Resultado ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 58 Actualización dinámica del árbol • Crear Modelos de Datos • ¿Qué estructura jerárquica con su propio modelo de datos hemos visto? • ¿Se podría usar un JTree para visualizarla? ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 59 Agenda • ¿Qué es? • Conceptos • Creación de un JTree • Personalización de un JTree • Selección de nodos • Actualización dinámica del árbol • Visualización de un archivo XML mediante un JTree ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 60 Visualización de un archivo XML mediante un JTree • Ejemplo: Visualizar un XML ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 61 Visualización de un archivo XML mediante un JTree • Ejemplo: Visualizar un XML • Este ejemplo permite visualizar los nodos DOM resultantes de cargar el archivo XML donde persistía la clase Números (vista en la presentación de XML). <?xml version="1.0" encoding="UTF-8" ?> <numeros nombre="Ejemplo1"> <numero>10</numero> <numero>23</numero> <numero>195</numero> <numero>4</numero> <numero>888</numero> </numeros> ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 62 Visualización de un archivo XML mediante un JTree • Nueva clase que implementa • TreeModel: Se declara una referencia al documento XML ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 63 Visualización de un archivo XML mediante un JTree • Nueva clase que implementa • TreeModel: Se declara la colección de listeners del Modelo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 64 Visualización de un archivo XML mediante un JTree • Nueva clase que implementa • TreeModel: Se declara un atributo booleano que informa si el nodo está comprimido o no. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 65 Visualización de un archivo XML mediante un JTree • En el constructor se carga el archivo XML en un árbol de nodos DOM ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 66 Visualización de un archivo XML mediante un JTree • Se lee el archivo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 67 Visualización de un archivo XML mediante un JTree • Saca el XML completo y lo parsea utilizando DOM ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 68 Visualización de un archivo XML mediante un JTree • Nueva clase que implementa • TreeModel: Esta nueva clase DEBE implementar TODOS los métodos de la interfaz TreeModel ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 69 Visualización de un archivo XML mediante un JTree • El método getRoot() retorna el nodo documento del árbol DOM • El método isLeaf(Object aNode) indica si el nodo del parámetro es hoja ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 70 Visualización de un archivo XML mediante un JTree • NodoDOM es una nueva clase para personalizar un nodo DOM (). ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 71 Visualización de un archivo XML mediante un JTree • La nueva clase NodoDOM contiene un atributo de tipo Node ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 72 Visualización de un archivo XML mediante un JTree • Métodos toString() • de la clase NodoDOM: Retorna el texto a deplegar en el árbol ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 73 Visualización de un archivo XML mediante un JTree • Más métodos de la clase ModeloArbolDOM ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 74 Visualización de un archivo XML mediante un JTree • Métodos para agregar y eliminar listeners al modelo ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 75 Visualización de un archivo XML mediante un JTree • Métodos para notificar los cambios a los listeners Demás métodos en el ejemplo … ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 76 Visualización de un archivo XML mediante un JTree • Por último… • En el panel donde se va a visualizar el árbol con el XML se crea el JTree public class PanelArbol extends JPanel { private JTree arbol; public PanelArbol( ) { DefaultMutableTreeNode top = new DefaultMutableTreeNode( "No se ha cargado nada" ); arbol = new JTree( top ); this.add( arbol, BorderLayout.CENTER ); } public void actualizar( DomTreeModel modelo ) { arbol.setModel( modelo ); } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 77 Visualización de un archivo XML mediante un JTree • Creación del modelo desde la clase de la ventana principal public void cargarArbol( ) { try { //Seleccionar el archivo JFileChooser fc = new JFileChooser( "./data/" ); fc.setDialogTitle( "Seleccionar XML a desplegar" ); int resultado = fc.showOpenDialog( this ); if( resultado == JFileChooser.APPROVE_OPTION ) { File archivoCadena = fc.getSelectedFile( ); //Se crea el modelo DomTreeModel modelo = new DomTreeModel( archivoCadena.getPath() ); panelArbol.actualizar( modelo ); } } ... ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 78 Referencias • http://java.sun.com/docs/books/tutorial/uiswi ng/components/tree.html • http://java.sun.com/j2ee/1.4/docs/tutorial/doc /JAXPDOM6.html ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co