[JTree] Problème d'ouverture de chemin dans un JTree
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 :
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 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;
}
} |
La classe de rendu :
Code:
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() {
}
} |
Et enfin l'appelle à cette classe :
Code:
1 2 3 4
|
DirectoryChooser chooser = new DirectoryChooser(jFrame);
chooser.show();
String cheminRep = chooser.getSelectedDirectory(); |
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).
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