2010-04-12 4 views
2

Je travaille sur la personnalisation d'une application cliente à source fermée. Il a un arbre dans l'interface utilisateur et exposé seulement une méthode pour obtenir le nœud sélectionné. Il renvoie une sous-classe de TreeNode. Et il n'y a aucun moyen d'obtenir une référence à l'arbre parent. Maintenant, je veux étendre le nœud sélectionné jusqu'à ses feuilles.Java Swing: Expanding TreeNode

Est-il possible d'obtenir une référence au composant JTree à partir d'un DefaultMutableTreeNode? Je prévois d'utiliser le JTree.expandPath() mais j'ai seulement la référence au treenode. Je suis nouveau à Swing et toutes les suggestions pour y parvenir sont les bienvenues.

Répondre

5

En fait, seul le JTree est conscient de l'état d'expansion, il n'y a pas de telles informations dans les TreeNodes. Les TreeNodes sont sur le côté "model", et n'ont pas de pointeur sur le JTree (du moins pas par défaut, vous pouvez bien sûr faire le vôtre avec une référence, mais cela casse un peu le pattern). Vous devriez reconsidérer l'endroit où vous voulez faire cette extension pour un endroit où vous avez accès à JTree (fournissez peut-être plus de détails sur votre contexte, pour en savoir plus sur ce que vous voulez faire et dans quelles circonstances) .

+1

Je travaille sur la personnalisation d'une application client à source fermée. Il a un arbre dans l'interface utilisateur et exposé seulement une méthode pour obtenir le nœud sélectionné. Il renvoie une sous-classe de TreeNode. Et il n'y a aucun moyen d'obtenir une référence à l'arbre parent. Maintenant, je veux étendre le nœud sélectionné jusqu'à ses feuilles. –

+0

@sarav - Dans ce cas, je crains que vous n'ayez pas de chance. Si vous n'avez aucun autre accès que TreeNodes, vous ne pouvez pas contrôler l'état étendu du JTree. Il pourrait y avoir une façon (très) crasse de le faire, si vous aviez accès à la fenêtre/au composant supérieur (ou à tout composant dans la même fenêtre), et si vous étiez sûr que sa structure est statique, vous pourriez faire votre chemin. le JTree à partir de là. – Gnoupi

+0

@sarav - (note rapide, pensez à modifier votre question avec ces nouveaux détails, pour que tout le monde puisse voir plus clairement toute la situation) – Gnoupi

1

regardant la source de DefaultMutableTreeNode, je ne vois aucune bonne façon de le faire, mais vous pouvez essayer une des opérations suivantes:

  • Extend DefaultMutableTreeNode et stocker la référence à votre arbre
  • Le nœud par défaut a un concept d'un "objet utilisateur". Vous pouvez définir la référence à l'arbre en tant que cet objet. C'est complètement non-sécurisé, mais ça marcherait probablement. EDIT: En fait, en regardant de plus près comment l'objet utilisateur est utilisé (en tant que représentation textuelle du chemin de l'arbre et en toString()), définir l'objet utilisateur de cette manière serait massacrer l'utilisation prévue de l'API. Donc: méchant, mais pourrait fonctionner.
0

Le noeud d'arbre est un élément du modèle d'arbre. En conséquence, il n'a aucune référence à l'arbre qui est sa vue. Ce qui pourrait être intéressant est de savoir dans quel objet vous êtes: puisque vous voulez réagir à un événement de souris, je suppose que vous avez accès à la couche de vue (au moins en récupérant le composant à l'origine de l'événement MouseEvent, qui devrait être le JTree). Si c'est le cas, vous pouvez obtenir la ligne sélectionnée et appeler expandPath. Construire le TreePath à partir du DefaultMutableTreeNode est laissé à titre d'exercice :-)

EDIT À partir des commentaires ci-dessous, laissez-moi clarifier ma réponse. Vous devrez appeler expandPath en utilisant un TreePath généré en appelant simplement getPath sur votre DefaultMutableTreeNode.

+0

Cependant, je ne vois pas de référence à un événement de souris dans sa question. – Gnoupi

+1

Si cela se produit en réponse à un clic d'utilisateur, 'event.getSource()' est probablement la plus belle option. – Ash