Java TreeNode: Comment empêcher getChildCount d'effectuer des opérations coûteuses?

StackOverflow https://stackoverflow.com/questions/154791

  •  03-07-2019
  •  | 
  •  

Question

J'écris une arborescence Java dans laquelle les nœuds d'arborescence peuvent avoir des enfants dont le calcul prend beaucoup de temps (dans ce cas, c'est un système de fichiers, où il peut y avoir des délais d'attente réseau empêchant d'obtenir une liste de fichiers d'un fichier attaché. conduire).

Le problème que je découvre est le suivant:

  1. getChildCount () est appelé avant que l'utilisateur demande spécifiquement l'ouverture d'une branche particulière de l'arborescence. Je crois que cela est fait pour que JTree sache s'il faut afficher une icône + à côté du nœud.

  2. Un nombre précis d'enfants de getChildCount () aurait besoin d'effectuer l'opération potentiellement coûteuse

  3. Si je simule la valeur de getChildCount () , l'arborescence n'alloue de l'espace que pour autant de nœuds enfants avant de demander une énumération des enfants. (Si je retourne '1', je ne verrai qu'un seul enfant dans la liste, malgré qu'il y en ait plus)

L’énumération des enfants peut être coûteuse et prendre beaucoup de temps, cela me convient. Mais je ne suis pas d'accord avec getChildCount () ayant besoin de connaître le nombre exact d'enfants.

Est-ce que je peux contourner ce problème?

Ajouté: L'autre problème est que si l'un des nœuds représente un lecteur de disquette (quelle archaïque!), le lecteur sera interrogé avant que l'utilisateur ne demande ses fichiers. s'il n'y a pas de disque dans le lecteur, cela entraîne une erreur système.

Mise à jour: Malheureusement, la mise en œuvre de l'écouteur TreeWillExpand n'est pas la solution. Cela peut vous permettre d’opposer son veto à une expansion, mais le nombre de noeuds affichés est toujours limité par la valeur renvoyée par TreeNode.getChildCount () .

Était-ce utile?

La solution 4

La solution comporte quelques éléments:

  • Comme l’a dit Lorenzo Boccaccia, utilisez le TreeWillExpandListener

  • De plus, , vous devez appeler les nœudsWereInserted sur l'arborescence afin d'afficher le nombre approprié de nœuds. Voir ce code

  • J'ai déterminé que si vous ne connaissez pas le nombre d'enfants, TreeNode.getChildCount () doit renvoyer au moins 1 (il ne peut pas renvoyer 0)

Autres conseils

http://java.sun.com /docs/books/tutorial/uiswing/components/tree.html#data

Faites défiler un peu vers le bas, il y a le didacticiel exact sur la création de nœuds de chargement paresseux pour le jtree, complet avec des exemples et de la documentation

Je ne suis pas sûr que ce soit tout à fait applicable, mais j'ai récemment évité les problèmes liés à la lenteur de l'arborescence en pré-calculant les réponses aux méthodes qui nécessiteraient normalement de parcourir la liste des enfants. Je les recalcule uniquement lorsque des enfants sont ajoutés, supprimés ou mis à jour. Dans mon cas, certaines méthodes auraient dû aller de manière récursive dans l'arborescence pour comprendre des choses comme "combien d'octets sont stockés" pour chaque nœud.

Si vous avez besoin d'un accès important à une fonctionnalité particulière de votre structure de données coûteuse en calcul, il peut être judicieux de la pré-calculer.

Dans le cas de TreeNodes, cela signifie que vos TreeNodes devront stocker leur nombre d'enfants. Pour l'expliquer un peu plus en détail: lorsque vous créez un nœud n0 , ce nœud a un nombre d'enfants ( cc ) de 0. Lorsque vous ajoutez un nœud n1 en tant qu'enfant de celui-ci, vous n1.cc + cc ++ .

Le problème le plus difficile est l'opération de suppression. Vous devez conserver les liens vers les parents et remonter dans la hiérarchie pour soustraire le cc de votre noeud actuel.

Si vous souhaitez simplement disposer de la fonctionnalité hasChildren pour vos nœuds ou remplacer le getChildCount , un booléen peut suffire et ne vous oblige pas à parcourir l'intégralité. hiérarchie en cas de suppression. Ou vous pouvez supprimer les backlinks et simplement dire que vous perdez en précision sur les opérations de suppression. L’interface TreeNode ne vous oblige en réalité pas à fournir une opération de suppression, mais vous en voudrez probablement de toute façon.

Eh bien, c'est le marché. Pour arriver à des valeurs précises précalculées, vous devrez conserver des backlinks de certaines sortes. Sinon, vous feriez mieux d'appeler votre méthode hasHadChildren ou le plus amusant isVirgin .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top