2009-09-17 17 views
1

Je suis à la recherche d'une solution threadée pour mettre à jour mon JTree chaque seconde.JTree mises à jour en temps réel?

Fondamentalement, je suis ...

  • Importation d'un fichier externe
  • Création d'un Enumeration hors de cette
  • Construire l'arbre de l'énumération

Le fichier externe peut changer au hasard, et les données dans l'arbre doit représenter ce changement dans un délai raisonnable. Comment serais-je en mesure de faire redessiner l'arborescence sans repeindre tout le volet de contenu dans lequel se trouve le JTree (via un panneau)?

Merci!

Répondre

0

Si vous repeignez le composant JTree, la zone de peinture sera découpée dans le reste du panneau contenant.

4

Il suffit de faire mettre à jour le modèle JTree et le JTree se repeint. La méthode la plus simple consiste à utiliser un DefaultTreeModel et, lorsque le fichier change, à créer des TreeNodes (éventuellement en utilisant DefaultMutableTreeNode) à partir de votre fichier et à appeler setRoot() sur le modèle avec le nœud de base de votre nouvelle arborescence.

0

Je ferais quelque chose comme @Tom suggéré si vous avez beaucoup de nœuds. La solution de @CarlG est probablement bonne pour quelques nœuds. Si vous mettez à jour l'ensemble du modèle d'arbre, chaque seconde vous rencontrez des problèmes de performance.

Je ne mettrais à jour que les limites visibles de l'arbre, si nécessaire, et conserverais quelque AST (arbre de syntaxe) quelque part. Si le modèle d'arbre (du document analysé) change toutes les secondes, je doute sérieusement que l'utilisateur aura le temps de faire défiler tout l'arbre chaque seconde.

User scrolled to bounds XXX 
A = First visible node 
B = Last visible node 
if someRangeBefore(A) is dirty update 
If region(A, B) is dirty 
    update nodes 

Il serait plus compliqué que ci-dessus de mettre en œuvre une stratégie de travail et très efficace pour mettre à jour les nœuds.

1

Je suppose que vous avez probablement lu ceci ailleurs: Swing n'est pas thread save;). Si vous voulez quand même mettre à jour un composant Swing à partir d'un autre thread, vous devez faire en sorte que cet autre thread insère les mises à jour sur le thread d'événement de Swing. La méthode pour le faire est EventQueue.invokeAndWait (Runnable).

Voici un exemple de code pour un problème similaire (faisant une synchronisation DTree avec une arborescence): http://www.onyxbits.de/content/java-and-directory-trees-joy-implementing-simple-filemanager

Vous devriez être intéressé par le fichier FileMonitor.java.

+0

+1 pour 'EventQueue.invokeAndWait (Runnable)' –

+0

-1 pour le lien - problèmes perçus (sauf l'incapacité de surveiller les changements dans le système de fichiers à l'intérieur pur Java) sont basés sur des connaissances insuffisantes sur FileSystemView – kleopatra

1

Essayez ceci si votre arbre utilise le DefalultTreeModel

((DefaultTreeModel)yourTree.getModel()).reload();