Bonjour,
Je viens de créer un JDialog contenant l'arborscence de windows. Ce JDialog n'affiche que les répertoires. Ce qui me permet dans d'autres applications, de lancer ce JDialog, et de récupérer le répertoire choisi par l'utilisateur.
Le listing des sous-répertoires ne se fait qu'à l'ouverture du répertoire sélectionné ( treeExpanded() ), ce qui permet d'accélérer l'affichage des sous dossiers.
Le problème est que je veux pouvoir lors de l'initialisation de cette arbre, lui faire ouvrir un chemin particulier : par exemple le dernier chemin que l'utilisateur a choisi.
voici mon code :
La classe de rendu :
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 public final class DirectoryChooser extends JDialog implements TreeExpansionListener, ActionListener { public static final int WIDTH = 400; public static final int HEIGHT = 340; private DefaultMutableTreeNode iRoot; private JTree iDirectoryTree; private String iSelectedDirectory; private JButton okButton; /** * Il faut d'abord créer une instance de DirectoryChooser. * Ensuite appliquer la méthode show() à cette instance. * Et enfin, appliquer la méthode getSelectedDirectory(). * * @param Frame owner * @param boolean allowCreate */ public DirectoryChooser(Frame owner) { super(owner, "Directory Chooser", true); try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } SwingUtilities.updateComponentTreeUI(this); iRoot = new DefaultMutableTreeNode("Directory"); iDirectoryTree = new JTree(iRoot); iDirectoryTree.setExpandsSelectedPaths(true); Container container = getContentPane(); container.setLayout(new BorderLayout()); JLabel label = new JLabel("Sélectionner un répertoire SVP."); label.setPreferredSize(new Dimension(110, 20)); okButton = new JButton("ok"); JPanel buttonPanel = new JPanel(); okButton.addActionListener(this); buttonPanel.add(okButton); iDirectoryTree.setCellRenderer(new treeCellRenderer()); iDirectoryTree.addTreeExpansionListener(this); constructTree(); container.add(label, "North"); container.add(new JScrollPane(iDirectoryTree), "Center"); container.add(buttonPanel, "South"); setSize(400, 340); setLocation(200, 200); } /** * Permet de construire l'arbre des différents lecteurs */ private void constructTree() { File directoryRoot[] = File.listRoots(); // J'ai supprimer le parcours du 1er lecteur (A:) for (int i = 1; i < directoryRoot.length; i++) { DefaultMutableTreeNode tempNode = new DefaultMutableTreeNode(directoryRoot[i]); foundSubDirectory(tempNode, directoryRoot[i]); iRoot.add(tempNode); } iDirectoryTree.setModel(new DefaultTreeModel(iRoot)); SwingUtilities.updateComponentTreeUI(iDirectoryTree); } /** * Ajoute au noeud courrant les sous noeuds qu'il possède (ne va pas jusqu'au bout de la branche, mais * seulement au niveau N-1). * @param currentNode * @param directory */ private void foundSubDirectory( DefaultMutableTreeNode currentNode, File directory) { File fileList[] = directory.listFiles(); if (fileList == null) return; for (int i = 0; i < fileList.length; i++) if (fileList[i].isDirectory()) currentNode.add(new DefaultMutableTreeNode(fileList[i]) { public String toString() { return ((File) getUserObject()).getName(); } }); } public void treeCollapsed(TreeExpansionEvent treeexpansionevent) {} public void treeExpanded(TreeExpansionEvent event) { setCursor(new Cursor(3)); DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent(); for (int i = 0; i < selectedNode.getChildCount(); i++) { DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) selectedNode.getChildAt(i); if (childNode.isLeaf()) foundSubDirectory(childNode, (File) childNode.getUserObject()); } setCursor(new Cursor(0)); } public void actionPerformed(ActionEvent e) { if (e.getSource() == okButton) { Object selectedDirectory = iDirectoryTree.getLastSelectedPathComponent(); if (selectedDirectory == null) return; this.iSelectedDirectory = ((File) ((DefaultMutableTreeNode) selectedDirectory) .getUserObject()) .getAbsolutePath(); hide(); getParent().remove(this); } } /** * Permet de récupérer le chemin du répertoire choisie * @return String */ public String getSelectedDirectory() { return iSelectedDirectory; } }
Et enfin l'appelle à cette classe :
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 class treeCellRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (leaf){ return super.getTreeCellRendererComponent(tree,value,selected,expanded,false,row,hasFocus); }else return super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); } treeCellRenderer() { } }
Le problème est que si je passe le chemin que je veux ouvrir dans le constructeur, celui n'est pas pris en compte (l'affichage ne s'est pas encore fait).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DirectoryChooser chooser = new DirectoryChooser(jFrame); chooser.show(); String cheminRep = chooser.getSelectedDirectory();
Si j'implémente les méthodes show() ou update(), elles ne sont même pas lancée lorsque je fait chooser.show() !!!! (D'ailleurs je comprends pas ce non plus).
Merci de m'indiquer pourquoi et comment faire pour que mon JDialog s'ouvre avec un chemin dans l'arbre déjà ouvert.
Ben
Partager