Sélectionner un chemin dans un jtree

Résolu
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009 - 23 nov. 2008 à 16:58
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009 - 25 nov. 2008 à 23:51
Bonjour,
Dans mon programme, si un noeud "n" est sélectionné dans arbre jTree1, tous ses noeuds parents doivent l'être aussi automatiquement. Pour cela, j'ai fait le code suivant:

   DefaultMutableTreeNode  node = (DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent();
   TreePath  path = new TreePath (node.getPath());
   jTree1.addSelectionPath(path.getParentPath());

Le problème est qu'il ne me sélectionne que le parent direct du noeud et pas les autres parents. Comment faire pour sélectionner tous les parents?

Un autre problème est qu'il faut que mon arbre permettent une sélection multiple

jTree1.getSelectionModel().setSelectionMod (TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);

mais lorsque je sélectionne deux noeuds en même temps,  le jTree1.getLastSelectedPathComponent() ne renvoie pas le dernier noeud sélectionné mais celui d'avant.

Quels est le problème SVP?
Merci pour votre aide.

12 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
24 nov. 2008 à 20:32
Tu as raison, je n'y avais plus pensé. J'avais fais les corrections dans le temps. Le mieux c'est que je te donne les sources telles que je les utilise actuellement:
http://www.java-forum.org/de/userfiles/user3690/treeSupport.zip
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
23 nov. 2008 à 17:59
Voici une très belle alternative que j'ai déjà utilisé avec succès dans une application de production et qui fonctionne parfaitement: un JTree avec CheckBoxes. Quand on coche un noeud, tous  les noeuds parents sont cochés également!
http://www.jroller.com/santhosh/date/20050610
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
24 nov. 2008 à 19:41
Merci uhrand pour ta réponse. C'est vrai que c'est nettement mieux avec les checkbox.
J'ai juste un petit problème avec la classe "getTreeCellRendererComponent", plus précisément au niveau de l'instruction:
   checkBox.setState(Boolean.TRUE);   

setState n'accèpte pas le type Boolean comme argument mais un State.
Et c'est la meme chose avec l'instruction:

checkBox.setState(selectionModel.isPartiallySelected(path) ? null : Boolean.FALSE);

Comment faire pour résoudre ce problème?
Merci pour votre aide.
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
24 nov. 2008 à 22:05
Merci beaucoup uhrand, ça marche super bien, c génial.


Encore une question, je veux avoir tous les noeuds sélectionnés (donc dans ce cas tous les noeuds cochés). D'habitude, pour avoir ça, je fais:


    TreePath[] paths = jTree1.getSelectionPaths();
     
Avec cette instruction, je n'ai que les chemins qui sont selectionnés, et pas ceux dont les noeuds sont cochés. Comment faire pour avoir les noeuds qui sont cochés?

Merci pour votre aide.

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 nov. 2008 à 07:29
checkedPaths = checkTreeManager.getSelectionModel().getSelectionPaths();
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
25 nov. 2008 à 12:27
Pardon uhrand, je sais que j'exagère, mais comment déclarer le "checkTreeManager"?
Merci.
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
25 nov. 2008 à 14:15
Désolé, il suffit juste de faire:
// makes your tree as CheckTree
CheckTreeManager checkTreeManager = new CheckTreeManager(yourTree);

// to get the paths that were checked
TreePath checkedPaths[] = checkTreeManager.getSelectionModel().getSelectionPaths();

Merci encore uhrand pour ton aide.
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
25 nov. 2008 à 14:57
Bonjour,
Encore une question, j'ai remarqué que cette instruction:
checkedPaths = checkTreeManager.getSelectionModel().getSelectionPaths();

ne donne pas les chemins en entier (jusqu'au feuilles) qui sont obtenus en cochant un noeud parent, et donc automatiquement ses noeuds fils sont sélectionnés. Cette instruction ne donne pas le chemin complet (le chemin ne va pas jusqu'au fils).
Je ne comprend pas pourquoi?
Merci pour votre aide.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 nov. 2008 à 17:16
Oui, c'est un peu déroutant, mais c'est voulu ainsi: un noeud sélectionné signifie automatiquement que les enfants sont sélectionnés également. En fait, ce serait une redondance de retourner explicitement tous les enfants.
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
25 nov. 2008 à 17:53
Salut,
Tu veux dire qu'il n'y a pas moyen de retourner tous noeuds qui sont cochés (ceux qui sont cochés par l'utilisateur, et ceux qui sont cochés automatiquement)? Parce que dans mon programme, j'ai besoin d'avoir tous les noeuds cochés.
Merci.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 nov. 2008 à 19:12
En fait, c'est assez simple: si le dernier noeud du chemin retourné n'est pas une feuille, il suffit de parcourir ses enfants pour avoir les noeuds cochés.
pseudo85 Messages postés 64 Date d'inscription mardi 7 février 2006 Statut Membre Dernière intervention 17 juillet 2009
25 nov. 2008 à 23:51
Oui c'est vrai c'est simple. Merci uhrand.
Rejoignez-nous