But : obtenir une arborescence de vos lecteurs sans que cela ne dure des heures (petits malins qui avez des Go de données sur vos immenses disques). J'utilise un MAX_LEVEL permettant de ne descendre que d'un nombre de niveau définit dans les arborescence. Ceci permet de limiter le temps de chargement. Une fois le JTree affiché, on écoute les évenements et notamment TreeExpanded qui lancera une recherche dans l'arborescence ouverte jusqu'à MAX_LEVEL... Et ainsi de suite.
Pour conserver l'objet FILE associé à chaque noeud j'ai créé une sous-classe FSNode qui me permet de conservé l'info.
J'ai également agrémenté mon code d'un Quick Sort (Tri rapide) afin d'obtenir la liste des éléments triée.
Enfin j'ai intégré mon JTree dans un JScrollPane afin de pouvoir utiliser les ascenceurs...
Bon j'espère qu'il y a pas trop de bétises dans ce code, cela fait seulement deux à trois semaines que je fais du JAVA... Toutes mes excuses sinon et les commentaires seront les bienvenus.
Conclusion :
Code écrit avec JBuilder (le zip contient le répertoire du Projet).
21 avril 2008 à 11:05
solution pour le problème relevé par yannickdh.
il faut ajouter un attribut "IsFirstExpanded" de type boulean à la classe FSNode qui sera à false par défaut et qu'on mettra à true lors à la fin de l'évenement "Expansion".
tester ensuite cette attribut dans au début de l'événement "Expansion" : si true ne rien faire sinon faire les appels nécessaire.
je n'ai vu tout le code, donc je vous ai donné ici la marche à suivre pour.
Bon courage.
12 juin 2006 à 15:26
En effet je découvre aujourd'hui les JTree :)
Bon, je me suis cassé la tête sur le problème du lecteur de disquette, alors l'endroit ou l'exception peut être détectée est dans addFolder lorsque l'on fait listFiles sur driveOrDir :
fileList = driveOrDir.listFiles();
vous verez dans la doc, listFiles est sensé levé une SecurityException "SI" un SecurityManager est présent, et voila le problème, je n'arrive pas à un créer un.
Sinon, pour le bug relevé par Aishu sur l'Expension, il suffit de tester dans addFolder si le noeud a déjà des fils ou non :
private void addFolder(File driveOrDir, DefaultMutableTreeNode node, int level) {
File[] fileList;
fileList = driveOrDir.listFiles();
if (fileList != null) {
sortFiles(fileList); // on tri les elements
}
// on ne cherche pas plus loin que le niveau maximal définit
if (level > MAX_LEVEL - 1) {return;}
// pour chaque élément
if (node.getChildCount() == 0) {
try {
for (int i = 0; i < fileList.length; i++) {
// en fonction du type d'élément
if (fileList[i].isDirectory()) {
// si c'est un répertoire on créé un nouveau noeud
FSNode dir = new FSNode(fileList[i].getName(), fileList[i]);
node.add(dir);
// on recherche les éléments (récursivité)
addFolder(fileList[i], dir, ++level);
}
if (fileList[i].isFile()) {
// si c'est un fichier on ajoute l'élément au noeud
node.add(new FSNode(fileList[i].getName(), fileList[i]));
}
}
}
catch (NullPointerException e) {
// rien
}
}
11 mars 2006 à 12:54
Mais j'ai un bug ...
Je suis sur un portable qui à un lecteur de cartes mémoires qui vous l'aurez devinné n'a pas forcément une carte mémoire dedans :X
Donc quand le programme liste les roots il tombe dessus et me lance le message windaube "Il n'y a pas de disque dans le lecteur. Insérez un disque dans le lecteur K:"
J'ai essayé de mettre un "if(drive[i].canRead()){" mais il me lance le message au moment du il fait son canRead donc je ne sais pas comment tester ca ...
Donc -1 pour "bug non géré" ca faut 9 ! (o;
16 juin 2004 à 16:04
9 juin 2004 à 14:09
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.