2010-09-29 31 views
8

J'ai utilisé un JTree dans mon interface graphique et l'a ajouté à un JFrame. Lorsque je veux le mettre à jour et changer ses nœuds dans une autre partie de mon programme (pendant que le programme est en cours, comme une action effectuée), j'essaie d'ajouter de nouveaux nœuds, ou de supprimer des nœuds; Mais mon interface ne change pas. S'il vous plaît me suggérer une solution.mise à jour JTree dans Java GUI

concernant

Répondre

15

En plus de la suggestion insertNodeInto vous pouvez également utiliser:

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

Alors merci pour votre digne réponse! Chaque fois que je veux mettre à jour mon arbre, j'utilise cette méthode. – sajad

+3

Cela fonctionnera mais est une approche de "force brute" quand il s'agit de grands arbres. Par exemple, si je devais boucler et ajouter 1000 nœuds à un arbre contenant déjà 50 000 éléments, cela serait très inefficace. – Adamski

+1

Dans la nature, à quelle fréquence l'arbre devient-il assez grand pour que cela devienne assez lent à s'inquiéter? –

2

Vous devez vous assurer que la mise à jour après votre modèle vous instruisez à déclencher un événement pour causer des écouteurs enregistrés pour être informés de l'événement. L'un des auditeurs sera le JTree et à la réception de l'événement, il sera repeint.

Par exemple, DefaultTreeModel contient les méthodes:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

En outre, comme avec tous les programmes Swing dont vous avez besoin pour vous assurer mettez à jour votre modèle sur le Dispatch événement Discussion.

+1

Vous n'avez pas à déclencher ces événements vous-même. Tout ce que vous avez à faire est de mettre à jour le modèle en appelant la méthode 'insertNodeInto', par exemple, et laissez le modèle s'occuper des événements de déclenchement dans les TreeModelListeners. – dogbane

+1

Bon point, bien que dans certains cas, il serait préférable de le gérer vous-même. Par exemple, si je voulais ajouter 1000 nœuds enfants, je ne souhaiterais pas déclencher 1000 événements "nœuds ajoutés". – Adamski

+0

Merci monsieur! Mais ces méthodes que vous avez mentionnées sont privées et ne sont pas accessibles. – sajad

-1

Voulez-vous dire l'aspect graphique est tout simplement ne pas montrer votre changement? Vous devriez probablement regarder int repaint() et revalidate().

Here's une bonne description de quand appeler lequel.

+0

Oui, appeler ces méthodes est nécessaire. – sajad

+4

-1, aucun repaint() et revalidate() ne sont pas nécessaires. Lorsque vous utilisez le modèle, le modèle est chargé de notifier la vue du changement afin que l'arbre puisse se repeindre. – camickr