2009-04-16 8 views
0

Je crée un JTree et un modèle pour cela dans une classe distincte de la classe GUI. Les données pour le JTree sont extraites d'un fichier.Rechargement d'un JTree pendant l'exécution

Maintenant, dans la classe GUI, l'utilisateur peut ajouter des fichiers du système de fichiers à une liste AWT. Après que l'utilisateur clique sur un fichier dans la liste, je veux que le JTree se mette à jour. Le nom de la variable pour le JTree est schemaTree.

J'ai le code suivant pour le lorsqu'un élément de la liste est sélectionné:

private void schemaListItemStateChanged(java.awt.event.ItemEvent evt) { 
     int selection = schemaList.getSelectedIndex(); 
     File selectedFile = schemas.get(selection); 
     long fileSize = selectedFile.length(); 
     fileInfoLabel.setText("Size: " + fileSize + " bytes"); 

     schemaParser = new XSDParser(selectedFile.getAbsolutePath()); 

     TreeModel model = schemaParser.generateTreeModel(); 
     schemaTree.setModel(model); 
} 

J'ai mis à jour le code correspondant à la réponse acceptée. Le JTree est maintenant correctement mis à jour en fonction du fichier que je sélectionne dans la liste.

+0

J'ai posté un suivi sur la question ici: http://bit.ly/ iaDqS –

Répondre

1

Je ne sais pas ce que je comprends votre question, mais je vais essayer ...

La bonne chose à faire devrait être, à mon humble avis:

  • obtenir le fichier
  • créer un nouveau TreeModel de votre fichier
  • donne le modèle à la DTree

En pseudocode, il ressemblerait à ce que:

File newContent = getSelectedByUser(...); 
TreeModel newModel = new MyFileBasedTreeModel(newContent); 
//this next part must be done in the EventDispatcherThread 
myTree.setModel(newModel); 

alors le JTree serait mis à jour, sans appel à repeindre, etc.

Hope it helps

+1

Très bien, j'ai maintenant modifié la méthode generateTree() pour retourner le modèle au lieu de l'arbre et renommé la méthode generateTreeModel(). L'arborescence est maintenant correctement mise à jour en fonction du fichier sur lequel je clique dans la liste. Merci! –

2

À partir des documents API Component.add.

Note: Si un composant a été ajouté à un conteneur qui a été affiché, validate doit être appelée sur ce conteneur pour afficher le nouveau composant . Si plusieurs composants sont en cours d'ajout, vous pouvez améliorer l'efficacité en appelant validation uniquement une fois, après que tous les composants aient été ajoutés.

Vous avez appelé repaint et validate sur un composant qui ne figure pas, qui ne sera pas efficace. Vous devez appeler ces méthodes sur le mainPanel après le add. Aussi revalidate a tendance à être meilleur que validate car il coalesces efficacement.

+0

J'ai essayé revalidate sur le mainPanel mais le JTree n'est toujours pas mis à jour. Je vais modifier le code dans la question d'origine à ce que j'ai maintenant –

+0

Il semble que vous n'avez pas ajouté le nouvel arbre au panneau. –

+0

Fonctionne maintenant .. Je ne supprime pas maintenant le JTree du tout, je ne mettais tout simplement pas à jour le modèle au bon endroit. Merci pour votre réponse –