Bonjour à tous !

Avant que vous ne tiriez à vu rien qu'après avoir lu le titre, laissez moi d'abord vous expliquer !

Alors, j'ai un JTree, qui se charge avec des informations provenant du DD, une sorte d'explorateur de fichiers revisité. Tout se passe bien pour ce qui est de l'ajout, etc... mais lorsque je veux recharger tout l'arbre (je suis obligé c'est pas très propre, mais je peux pas faire autrement, je dois TOUT reconstruire à chaque fois, mais bref, c'est assez rare, etc, donc je ne souhaite pas modifier la façon de construire l'arborescence, enfin, si c'est possible...) Donc, l'arbre se recharge/reconstruit sans soucis, mais il réapparaît donc fermé, comme neuf... J'aimerai que le dernier chemin sélectionné (puisque la plupart du temps, quand on veut rafraîchir l'affichage c'est à la suite d'un ajout de fichier/dossier) reste ouvert. Et si possible, le top serait que tous les chemins ouverts le reste aussi, mais bon, je ne sais pas si c'est possible... Ou en tout cas, je ne vois vraiment pas la démarche qu'il faudrait avoir

Donc sinon, il y a aussi un autre moyen, par un JButton, de déclencher la mise à jour des données. Mais dans les 2 cas (que ça soit à la suite d'un ajout de fichier/dossier) ou après le clic bouton (euh, vous me suivez toujours là ?) et bien rien ne s'ouvre, et une erreur est soulevée : (ce qu'il y a avant est le résultat du sysout, le code de la fonction vient juste après)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
I :
[DOSSIER GENERAL, A l'étude]
II :
[DOSSIER GENERAL, A l'étude]
III :
[DOSSIER GENERAL, A l'étude]
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.tree.TreePath cannot be cast to javax.swing.tree.TreeNode
	at javax.swing.tree.DefaultTreeModel.isLeaf(Unknown Source)
	at javax.swing.JTree.expandPath(Unknown Source)
	at vues.JPanelExplorateur.rafraichirAffichage(JPanelExplorateur.java:642)
	at vues.JPanelExplorateur$6.actionPerformed(JPanelExplorateur.java:480)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Et pour ce qui est du code de la fonction en elle-même :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
public void rafraichirAffichage(){
		TreePath selectionSave = new TreePath(tree.getSelectionPath());
 
		System.out.println("I :");
		for(int i = 0 ; i < selectionSave.getPath().length ; i++)
			System.out.println(selectionSave.getPath()[i]);
 
		File dosGen = null;
		try {
			dosGen = new File(Deserialiser.deserialiserCheminDosGen());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		racineTree = new DefaultMutableTreeNode(dosGen.getAbsoluteFile().getName(), true);
 
		construireArbo(root, racineTree);	
 
		System.out.println("II :");
		for(int i = 0 ; i < selectionSave.getPath().length ; i++)
			System.out.println(selectionSave.getPath()[i]);
 
		((DefaultTreeModel) tree.getModel()).setRoot(racineTree);
		//((DefaultTreeModel) tree.getModel()).reload();// pas besoin apparement
 
		System.out.println("III :");
		for(int i = 0 ; i < selectionSave.getPath().length ; i++)
			System.out.println(selectionSave.getPath()[i]);
 
		tree.setSelectionPath(selectionSave);
		tree.expandPath(selectionSave);//ERREUR SOULEVEE ICI !!!!!
	}
Donc ensuite, je dois quand même ajouter que j'ai déjà fait des fonctions pour ouvrir automatiquement certains nœud, notamment une fonction récursive qui ouvre tous les nœuds en-dessous de lui dans l'arborescence. Et toutes ces fonctions fonctionnent parfaitement !! Tout se déroule nickel.

Exemple pour la fonction qui ouvre tout depuis le nœud sélectionné (déclenché depuis un JButton) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
JButton btnToutOuvrirDepuisCeNoeud = new JButton("Ouvrir tout (sélection)", new ImageIcon(getClass().getResource("/images/dossiertoutdevelopper.png")));
		btnToutOuvrirDepuisCeNoeud.setToolTipText("Ouvrir tous les sous-dossiers depuis le nœud sélectionné");
 
		alBtn.add(btnToutOuvrirDepuisCeNoeud);
 
		btnToutOuvrirDepuisCeNoeud.addActionListener(new ActionListener() {
 
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ouvrirNoeud((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent()); 
			}
 
			private void ouvrirNoeud(DefaultMutableTreeNode node){
				for(int i = 0 ; i < node.getChildCount() ; i++)
				{
					if(!node.getChildAt(i).isLeaf())
					{
						tree.expandPath(new TreePath(((DefaultMutableTreeNode) node.getChildAt(i)).getPath()));
						ouvrirNoeud((DefaultMutableTreeNode) node.getChildAt(i));
					}
				}
			}
		});
Voilà, donc je ne comprends pas du tout ce qui se passe, surtout que le sysout qui affiche le texte au-dessus de l'erreur a l'air d'afficher le TreePath du nœud sélectionné, alors que je lui demande d'afficher les différents nœuds contenus dans ce TreePath. En fait, je pense que l'erreur vient donc de là, que lorsque je fais "selectionSave.getPath()[i]", il ressort non pas un Object (en fait un DefaultMutableTreeNode) mais un TreePath, et je ne comprends pas du tout pourquoi il fait ça...

Donc voilà, enfin, ma (mes?) question(s) :
- où est mon erreur ? (j'aimerai comprendre pourquoi ça ne marche pas )
- comment faire pour garder ouvert le nœud sélectionné ouvert après un rechargement des données ?
- et enfin, est-ce que c'est possible de ré-ouvrir TOUS les nœuds qui étaient ouverts avant un rechargement des données ? si oui, je ne suis pas contre une petit mise sur la voie...