2010-06-02 6 views
3

J'ai un assistant avec plusieurs écrans où l'utilisateur doit remplir ses détails pour un traitement ultérieur. Au second écran, j'ai un groupe de radio avec trois boutons radio qui permettent des éléments supplémentaires. Pour continuer, l'utilisateur doit en choisir un. Lorsque l'utilisateur sélectionne le troisième bouton, la sélection unique JTree est remplie avec les données activées et l'utilisateur doit en sélectionner une option. Ensuite, l'utilisateur doit appuyer sur "Suivant" pour passer à l'écran suivant. L'option qu'il a sélectionnée est enregistrée sous la forme TreePath. Jusqu'ici tout va bien.Comment faire pour étendre JTree?

Mon problème est le suivant. Si l'utilisateur veut revenir de l'écran suivant à l'écran avec un JTree, je veux lui fournir le JTree étendu à l'option qui a été sélectionnée et mettre en surbrillance l'option. Cependant, tout ce que j'essaie de faire pour cela (toutes les combinaisons de expandPath, scrollPathToVisible, addSelectionPath, makeVisible) me fournit toujours un arbre replié. J'essaie d'étendre les feuilles et les nœuds. Mon code ressemble à ceci:

rbProcessJTree.setSelected(isProcessJTree()); 

if (null != getSelectedTablePath()){ 
    trTables.addSelectionPath(getSelectedTablePath()); 
    trTables.expandPath(getSelectedTablePath()); 
    trTables.scrollPathToVisible(getSelectedTablePath()); 
} 

Lorsque setSelected() est appelé, auditeur de changement d'état est invoqué qui permet JTree. Le modèle est chargé lors de l'initialisation du formulaire.

Chaque fois que je passe d'un écran à l'autre, je sauvegarde les données d'entrée de l'écran précédent et je les dispose. Ensuite, lorsque j'ai besoin d'ouvrir l'écran précédent, je sauvegarde les données de l'écran suivant, je les dispose, charge les données sur cet écran et les affiche. Donc, chaque fois que l'écran est généré à partir de zéro.

Pourriez-vous expliquer, quelle séquence d'opérations doit être effectuée pour obtenir JTree développé dans un formulaire nouvellement créé, avec le modèle de données chargé et le chemin de sélection fourni?

+0

Bonjour Dzmitry Zhaleznichenka, avez-vous pu obtenir une réponse à votre question? Je suis confronté au même problème, je l'ai posté ici

http://stackoverflow.com/questions/6252462/jtree-lazy-load-expand
S'il vous plaît aviser. – ShamsR

Répondre

1

Voici un code que j'ai utilisé pour enregistrer les chemins d'expansion et les chemins sélectionnés dans JTree. Vous pouvez enregistrer les choses d'état ici entre les pages Suivant et Précédent.

// record expanded nodes to reinstate later; 
TreePath rootPath= new TreePath(objectWeKnowIsAtRoot); 

Enumeration<TreePath> expandedPaths = tree.getExpandedDescendants(rootPath); 

// record current-selection - it's OK if it's null 
TreePath selectedPath = tree.getSelectionPath(); 


// ******* do stuff that may, and often will, modify our tree content ******** 


// restore valid expansion paths (some may - correctly - have been removed in modifications) 
while (expandedPaths != null && expandedPaths.hasMoreElements()) 
{ 
    TreePath path = expandedPaths.nextElement(); 
    if (isPathValid(path)) 
    { 
     tree.expandPath(path); 
    } 
} 

// restore selected path, if apt 
if (isPathValid(selectedPath)) 
{ 
    tree.setSelectionPath(selectedPath); 
} 

La méthode isValidPath() utilisée ci-dessus est basé sur celui-ci:

http://forums.sun.com/thread.jspa?threadID=567157&tstart=38085

+0

J'ai essayé cette approche, mais ça ne marche pas non plus. Je ne connais pas la raison. Ont vu plus tard que les chemins retournés dans l'énumération ont un ordre aléatoire, les ont convertis en ArrayList et triés à partir de root, qu'essayé avec ça. Aucune chance. Ajouté expandPath() pour le chemin sélectionné lui-même. En aucune façon. Pas d'idées. Merci pour la réponse si. En passant, quand je le débogue, je vois que pour mon chemin de sélection isVisible() est vrai mais isExpanded() est faux. Cela peut-il aider? –

+0

Hmm; faites-vous définitivement les trucs de sélection/d'expansion après que les données ont été peuplées?Ce que vous pouvez essayer est d'ajouter un bouton "debug this" à votre assistant qui, une fois pressé, fait la sélection/expansion, vous donnant une chance de confirmer visuellement que oui toutes les données sont présentes et correctes en premier? – Brian

+0

Je vais essayer dans une heure ou deux, quand terminer avec la tâche en cours. Cependant, isPathValid() renvoie toujours true pendant le débogage et la méthode expandPath() s'exécute en conséquence dans votre algorithme. Cela devrait signifier que les données ont été peuplées, n'est-ce pas? Je remplis le modèle de données lors de l'initialisation du formulaire. Seulement après cela, j'essaie d'effectuer quelques actions avec. Peut-être que quelque chose doit être exploré concernant mon écouteur de changement d'état pour un bouton radio. Il tire plusieurs fois avant que j'arrive à la méthode de traitement des arbres. –

1

Si vous utilisez DefaultMutableTreeNode, vous pouvez toujours utiliser un Enumeration pour rechercher le TreeNode que vous voulez. Alors setSelectionPath() devrait fonctionner si getExpandsSelectedPaths() est vrai.

Edit: je pensais plus à l'aide d'un Enumeration de DefaultMutableTreeNode:

JTree tree = new JTree(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); 
... 
private TreePath find(DefaultMutableTreeNode root, String s) { 
    Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration(); 
    while (e.hasMoreElements()) { 
     // return match 
    } 
    return null; 
} 

Ensuite, vous pouvez faire ceci:

TreePath path = find(root, "pizza"); 
tree.setSelectionPath(path); 
tree.scrollPathToVisible(path); 
+0

Liste tpa = treeStorage.getExpandedPathsList(); if (null! = Tpa) { Collections.sort (tpa, nouveau TreePathComparator()); pour (TreePath t: tpa) { if (isPathValid (t)) { trTables.expandPath (t); }} } si (isPathValid (treeStorage.getSelectedTablePath())) { trTables.setSelectionPath (treeStorage.getSelectedTablePath()); System.out.println ("Développe:" + trTables.getExpandsSelectedPaths()); } Ce code me renvoie true. Cependant, l'arbre est toujours effondré. L'énumération renvoie les résultats dans un ordre aléatoire et ne peut pas être réinitialisée, donc je l'ai changé en ArrayList. Désolé pour le formatage. –

Questions connexes