2010-09-29 39 views
8

Utilicé un JTree en mi GUI y lo agregué a un JFrame. Cuando quiero actualizarlo y cambiar sus nodos en otra parte de mi programa (mientras el programa se está ejecutando, como una acción realizada) intento agregar nuevos nodos o eliminar nodos; Pero mi interfaz no cambia. Por favor sugiérame una solución.actualizando JTree en Java GUI

respecto

Respuesta

15

Además de la sugerencia insertNodeInto también se puede utilizar:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
root.add(new DefaultMutableTreeNode("another_child")); 
model.reload(root); 
+1

¡Así que gracias por tu valiosa respuesta! Cada vez que quiero actualizar mi árbol, uso este método. – sajad

+3

Esto funcionará, pero es un enfoque de "fuerza bruta" cuando se trata de árboles grandes. Por ejemplo, si tuviera que buclear y agregar 1000 nodos a un árbol que ya contiene 50,000 elementos, esto sería muy ineficiente. – Adamski

+1

En la naturaleza, ¿con qué frecuencia el árbol crece lo suficiente para que esto se vuelva lo suficientemente lento como para preocuparse? –

2

Usted necesita asegurarse de que después de actualizar el modelo que se instruya a desencadenar un evento que causa detectores registrados para ser notificado del evento. Uno de los oyentes será el JTree y al recibir el evento se volverá a pintar.

Por ejemplo, DefaultTreeModel contiene los métodos:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

También, como con toda la programación de oscilación que necesita para asegurarse de que está actualizando su modelo en la de distribución de eventos Hilo.

+1

No tiene que despedirse de estos eventos. Todo lo que tiene que hacer es actualizar el modelo llamando al método 'insertNodeInto', por ejemplo, y dejar que el modelo se encargue de disparar eventos a TreeModelListeners. – dogbane

+1

Buen punto, aunque en algunos casos sería mejor que lo gestiones tú mismo. Por ejemplo, si quisiera agregar 1000 nodos secundarios, no desearía activar 1000 eventos de "nodos agregados". – Adamski

+0

¡Gracias, señor! Pero estos métodos que mencionas son privados y no se pudo acceder. – sajad

-1

¿Quiere decir que el aspecto interfaz gráfica de usuario no está mostrando su cambio? Probablemente debería mirar int repaint() y revalidate().

Here's una buena descripción de cuándo llamar a cuál.

+0

Sí llamando a este método es necesario. – sajad

+4

-1, No repintar() y revalidar() no son necesarios. Cuando abra el modelo, el modelo es responsable de notificar la vista del cambio para que el árbol pueda repintarse. – camickr