Sélection d'un noeud après regénération de JTree
Bonjour à tous,
J'ai un arbre Jtree qui se regénère à des moments opportuns. Pour que l'utilisateur n'ai pas à redéployer tous les noeuds amenant à sa sélection, voilà ce que je fais:
- sauvegarde de chemin de la sélection courante
- regénération de l'arbre
- si la sélection était null, on sélectionne la racine (celui là marche)
- sinon on sélectionne et on étend le noeud parent de celui sélectionné avant regénération (Ne marche pas!!)
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public void update(Observable obs, Object argument) {
if(obs!=null){
System.out.println(">>>> Path avant génération "+this.tree.getSelectionPath());
//---Récupération du chemin de l'élément sélectionné
TreePath tp = this.tree.getSelectionPath();
//--- Suppression de l'arbre entier
this.removeAll();
//---Regénération de l'arbre
AircraftModel aircraft = (AircraftModel)obs ;
DefaultMutableTreeNode aircraftRootNode = new DefaultMutableTreeNode(aircraft);
for(CalculatorModel calc : aircraft.getCalculatorList()){
DefaultMutableTreeNode calcNode = new DefaultMutableTreeNode(calc);
aircraftRootNode.add(calcNode);
for(StandardModel std : calc.getStdList()){
DefaultMutableTreeNode stdNode = new DefaultMutableTreeNode(std);
calcNode.add(stdNode);
for(DemandModel dmd : std.getDmdList()){
DefaultMutableTreeNode dmdNode = new DefaultMutableTreeNode(dmd);
stdNode.add(dmdNode);
}
}
}
((DefaultTreeModel)this.tree.getModel()).setRoot(aircraftRootNode);
((DefaultTreeModel) this.tree.getModel()).reload();
//TODO: Trouver comment étendre le parent du noeud sélectionné avant regénération de l'arbre
//---Si l'arbre avait une sélection avant génération
if(tp!=null){
System.out.println(" ----- Selection à étendre : "+ tp.getParentPath());
//on sélectionne le noeud parent puis on l'étend / [PAS OK]
this.tree.setSelectionPath(tp.getParentPath());
this.tree.expandPath(tp.getParentPath());
}else{
//Sinon on sélectionne la racine / [OK]
TreeNode n = (DefaultMutableTreeNode)this.tree.getModel().getRoot();
this.tree.setSelectionPath(new TreePath(n));
}
this.add(new JScrollPane(tree),BorderLayout.CENTER);
this.validate();
//Les boutons
panelbutton.add(move);
panelbutton.add(delete);
this.add(panelbutton, BorderLayout.SOUTH);
} |
Le résultat en console:
Code:
1 2
| >>>> Path avant génération [A380, FCDC_A380, F10.3 (94)]
----- Selection à étendre : [A380, FCDC_A380] |
Il n'y a aucune erreur (exception) mais à mon avis lors de la regénération, les objets prennent d'autres références et le treePath ne correspond plus à ces nouveaux objet, donc impossible à étendre ou sélectionner.
Une idée pour résoudre ou contourner le pb?
Merci beaucoup!