OVH Cloud OVH Cloud

[GUI]composants pour explorateur

7 réponses
Avatar
Ced
Bonjour!

Je fais une application qui se rapproche, du point de vue graphique, de
l'explorateur Windows: arborescence du système de fichiers à gauche, liste
de fichiers à droite. Et je suis surpris qu'aucun des composants n'existent,
alors qu'ils constituent à mon avis un besoin courant:

- Pour l'arborescence, il existe bien le JTree, mais je n'ai pas trouvé de
Model ni de TreeCellRenderer pour y mettre le système de fichiers. J'ai bien
trouvé sur le net quelquers ressources pour afficher une arborescence, mais
aucune ne reprend, dans l'environnement Windows, les éléments Bureau, Poste
de travail, ...

- Pour la liste de fichiers, je n'ai carément pas trouvé de composant
permetant un affichage grandes icones/petites icones/list/détails. Et donc
encore moins un controle affichant de cette manière les fichiers d'un
répertoire donné.

Je suis donc en train de coder ces composants que je partagerai avec joie,
mais j'ai vraiment l'impression d'être en train de réinventer la roue.
Quelqu'un a-t-il deja eu besoin de tels composants? quelles conséquences?

merci de votre aide!

Ced.

7 réponses

Avatar
Vincent Brabant
Bonjour!

Je fais une application qui se rapproche, du point de vue graphique, de
l'explorateur Windows: arborescence du système de fichiers à gauche, liste
de fichiers à droite. Et je suis surpris qu'aucun des composants n'existent,
alors qu'ils constituent à mon avis un besoin courant:

- Pour l'arborescence, il existe bien le JTree, mais je n'ai pas trouvé de
Model ni de TreeCellRenderer pour y mettre le système de fichiers. J'ai bien
trouvé sur le net quelquers ressources pour afficher une arborescence, mais
aucune ne reprend, dans l'environnement Windows, les éléments Bureau, Poste
de travail, ...

- Pour la liste de fichiers, je n'ai carément pas trouvé de composant
permetant un affichage grandes icones/petites icones/list/détails. Et donc
encore moins un controle affichant de cette manière les fichiers d'un
répertoire donné.

Je suis donc en train de coder ces composants que je partagerai avec joie,
mais j'ai vraiment l'impression d'être en train de réinventer la roue.
Quelqu'un a-t-il deja eu besoin de tels composants? quelles conséquences?

merci de votre aide!

Ced.


Pourquoi tu ne regardes pas les sources de ton JDK Java.

Je crois que le nom de la classe est FileChooser.
Cela devrait déjà te donner de sérieuses piste.

--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be

Avatar
RaOuf
on m'a dit qu'il existait un TreeModel, j'ai pas eu le temps de vérifier (
si j'ai bien compris tu veux utiliser un modèle-vue-controleur)

RaOuf
Avatar
Ced
Salut Vincent!

J'ai regardé ça, mais le JFileChooser est en fait une boîte de dialogue de
type Ouvrir / Sauvegarder sous..., pas une arborescence. Je me sers
d'ailleurs de son FileSyustemView pour creer mon arborescence.

Merci de ton aide.

"Vincent Brabant" a écrit dans le message de
news:3fae1525$0$3992$
Bonjour!

Je fais une application qui se rapproche, du point de vue graphique, de
l'explorateur Windows: arborescence du système de fichiers à gauche,
liste


de fichiers à droite. Et je suis surpris qu'aucun des composants
n'existent,


alors qu'ils constituent à mon avis un besoin courant:

- Pour l'arborescence, il existe bien le JTree, mais je n'ai pas trouvé
de


Model ni de TreeCellRenderer pour y mettre le système de fichiers. J'ai
bien


trouvé sur le net quelquers ressources pour afficher une arborescence,
mais


aucune ne reprend, dans l'environnement Windows, les éléments Bureau,
Poste


de travail, ...

- Pour la liste de fichiers, je n'ai carément pas trouvé de composant
permetant un affichage grandes icones/petites icones/list/détails. Et
donc


encore moins un controle affichant de cette manière les fichiers d'un
répertoire donné.

Je suis donc en train de coder ces composants que je partagerai avec
joie,


mais j'ai vraiment l'impression d'être en train de réinventer la roue.
Quelqu'un a-t-il deja eu besoin de tels composants? quelles
conséquences?



merci de votre aide!

Ced.


Pourquoi tu ne regardes pas les sources de ton JDK Java.

Je crois que le nom de la classe est FileChooser.
Cela devrait déjà te donner de sérieuses piste.

--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be




Avatar
Vincent Brabant
Salut Vincent!

J'ai regardé ça, mais le JFileChooser est en fait une boîte de dialogue de
type Ouvrir / Sauvegarder sous..., pas une arborescence. Je me sers
d'ailleurs de son FileSyustemView pour creer mon arborescence.
Oui, je sais, mais c'étais plus our que tu regardes comment il font pour

retrouver les éléments comme Bureau, Poste de travail, Mes Documents,
etc dans la partie du dessus où tu peux sélectionner ton répertoire.

Et cette classe te permet déjà de switcher entre normal et détails.
Peut-être y trouveras tu des idées simples pour les 2 autres.

Et dans le tutotial de sun, il y a même un exemple où on hérite de cette
classe pour rajouter un filtre sur les images uniquement et voir alors
une vignette de l'image. Je ne peux que t'encourager à y jeter un oeil.

Et je pense qu'en combinant tout cela, tu devrais y arriver, non.

Merci de ton aide.

"Vincent Brabant" a écrit dans le message de
news:3fae1525$0$3992$


Bonjour!

Je fais une application qui se rapproche, du point de vue graphique, de
l'explorateur Windows: arborescence du système de fichiers à gauche,



liste

de fichiers à droite. Et je suis surpris qu'aucun des composants



n'existent,

alors qu'ils constituent à mon avis un besoin courant:

- Pour l'arborescence, il existe bien le JTree, mais je n'ai pas trouvé



de

Model ni de TreeCellRenderer pour y mettre le système de fichiers. J'ai



bien

trouvé sur le net quelquers ressources pour afficher une arborescence,



mais

aucune ne reprend, dans l'environnement Windows, les éléments Bureau,



Poste

de travail, ...

- Pour la liste de fichiers, je n'ai carément pas trouvé de composant
permetant un affichage grandes icones/petites icones/list/détails. Et



donc

encore moins un controle affichant de cette manière les fichiers d'un
répertoire donné.

Je suis donc en train de coder ces composants que je partagerai avec



joie,

mais j'ai vraiment l'impression d'être en train de réinventer la roue.
Quelqu'un a-t-il deja eu besoin de tels composants? quelles



conséquences?

merci de votre aide!

Ced.




Pourquoi tu ne regardes pas les sources de ton JDK Java.
Je crois que le nom de la classe est FileChooser.
Cela devrait déjà te donner de sérieuses piste.

--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be





--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be



Avatar
vclassine
"Ced" wrote in message news:<bol39f$iin$...
Je suis donc en train de coder ces composants que je partagerai avec joie,
mais j'ai vraiment l'impression d'être en train de réinventer la roue.
Quelqu'un a-t-il deja eu besoin de tels composants? quelles conséquences?


J'ai été confronté au même problême récemment, du coup j'en ai fait un
à la va vite, mais il rame grave. Comme toi je me suis basé sur un
JTree et les annexes du JFileChooser. J'espère me penché bientôt sur
son optimisation, reste que je ne sais pas si c'est possible de
manière efficace. Si c'est les classes annexes du JFileChooser et pas
ma conception , dommage!!!

Si j'y arrive je te fais signe, et bien sûr si tu y arrive, je suis
preneur...

Avatar
Ced
"Vincent" a écrit dans le message de
news:
J'espère me penché bientôt sur
son optimisation, reste que je ne sais pas si c'est possible de
manière efficace. Si c'est les classes annexes du JFileChooser et pas
ma conception , dommage!!!


Je peux te confirmer que les classes du JFileChooser rament.Si tu t'amuse à
les appeler chaque fois que tu as besoin d'une icône ou a chaque appel d'un
getChild, tu t'en sors plus.
Du coup, j'ai fait une classe qui sert de cache pour chaque répertoire, avec
un Timer qui le rafraichit régulièrement. Ca améliore déjà nettement la
navigation. Les problèmes auxquels je suis confrontés:

- lecteur a: Pour afficher le Poste de travail, ma classe va chercher le
contenu du lecteur a: Et avec le refresh, c'est encore plus grave, il y va
toutes les 10 secondes.c'est pas terrible d'entendre le "cloc cloc" du
lecteur toutes les 10 secondes. Sans compter que ca ralentit tout.

- dossiers chargés: l'inconvénient du FileSystemView est qu'on ne peut pas
passer de FileFilter (opu équivalent) lors d'un getFile. Du coup, pour ne
prendre que les répertoires, il faut tout ramener, puis tout tester avec un
isTraversable(), puis transvaser. Pas super performant, ca rââââââmeuuuu...
Je voudrais utiliser les méthodes de File, plus efficaces, mais comment
discerner le cas où on est dans un folder correct (C:mon_repertoire, là on
peut utiliser File) du cas où on est dans une invention à la microsoft
(Bureau, Poste de travail, voisinage réseau, .. là, il faut utiliser le
FileSystemView) ???

Je te mets déjà mon code pour que tu puisses te rendre compte, et
éventuellement avancer avec moi.
J'ai donc 4 classes:
- FileProperties: le cache qui est rafraîchi pour chaque fichier
- FileTreeModel : le model
- FileTreeCellRenderer : pour l'affichage
- FileTree : le composant lui-même

Bon, tout n'est pas super commenté, et il y a quelques bridages (le refresh
ne fait rien en fait; les floppy ne sont pas explorables...). Bref, c'est en
chantier.

FileProperties.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.Timer;
import javax.swing.filechooser.*;

/**
* This method is intended to be used in the <code>TreeModel</code> of a
* <code>FileTree</code>, and gathers the properties required to display
* a folder or a file in the <code>FileTree</code>.
* @author C&eacute;dric Bourgeois
* @version 1.0
*/

public class FileProperties {
/** default value for refresh rate. 10 seconds */
private final static long DEFAULT_REFRESH_RATE = 10000;
/* True if only folders are taken as children. */
private boolean foldersOnly;
/* The refering file */
private File file;
/* the FileSystemView to use to get file system information. */
private FileSystemView fsView;
/* the actual refresh rate */
private long refreshRate;
/* the file's icon */
private Icon fileIcon;
/*the name of the File as displayed in a component*/
private String displayName;

/** The timer that updates the properties on a regular basis */
private Timer updater = new Timer(10000, new ActionListener () {
public void actionPerformed(ActionEvent e) {/*getProperties();*/}
});

/* Semaphore for accessing properties. Avoids reading while data is being
* updated.*/
private boolean lock;
/* just the list of subdirectories */
private File[] children;
/* Subdirectories with properties. Objects are created on-demand. */
private FileProperties[] childrenProperties;


/*
======================================================================== Constructors
======================================================================== */

/**
* Builds a FileProperties that will use the default
* <code>FileSystemView</code> to get information about the given
* <code>File</code>, and update it at the default refresh rate.
*
* @param file the <code>File</code> whose properties must be retreived.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*/
public FileProperties(File file, boolean foldersOnly) {
this(FileSystemView.getFileSystemView(), file,
DEFAULT_REFRESH_RATE, foldersOnly);
}

/**
* Builds a FileProperties that will use the default
* <code>FileSystemView</code> to get information about the given
* <code>File</code>, and update it at the given refresh rate.
*
* @param file the <code>File</code> whose properties must be retreived.
*
* @param refreshRate the time in milliseconds between two properties
refresh
* processes.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*/
public FileProperties(File file, long refreshRate, boolean foldersOnly) {
this(FileSystemView.getFileSystemView(), file, refreshRate,
foldersOnly);
}

/**
* Builds a FileProperties that will use the given
* <code>FileSystemView</code> to get information about the given
* <code>File</code>, and update it at the given refresh rate.
*
* @param fsView the <Code>FileSystemView</code> where the
* <code>FileProperties</code> will get the file's properties.
*
* @param file the <code>File</code> whose properties must be retreived.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*/
public FileProperties(FileSystemView fsView, File file, boolean
foldersOnly) {
this(fsView, file, DEFAULT_REFRESH_RATE, foldersOnly);
}

/**
* Builds a FileProperties that will use the given
* <code>FileSystemView</code> to get information about the given
* <code>File</code>, and update it at the given refresh rate.
*
* @param fsView the <Code>FileSystemView</code> where the
* <code>FileProperties</code> will get the file's properties.
*
* @param file the <code>File</code> whose properties must be retreived.
*
* @param refreshRate the time in milliseconds between two properties
refresh
* processes.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*/
public FileProperties(
FileSystemView fsView, File file, long refreshRate, boolean
foldersOnly) {

/* sets the object's main properties (user parameters) */
this.fsView = fsView;
this.file = file;
this.refreshRate = refreshRate;
this.foldersOnly = foldersOnly;

/* get file properties ans launch updater */
getProperties();
if (!fsView.isFloppyDrive(file))
updater.start();
}

/*
======================================================================== Public methods
======================================================================== */

/**
* Returns a set of FileProperties that are the roots of the given
* <code>FileSystemView</code>.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*
* @return the file system roots.
*/
public static FileProperties[] getRootFileProperties(boolean foldersOnly)
{
return getRootFileProperties(
FileSystemView.getFileSystemView(), DEFAULT_REFRESH_RATE,
foldersOnly);
}


/**
* Returns a set of FileProperties that are the roots of the given
* <code>FileSystemView</code>.
*
* @param refreshRate the time in milliseconds between two properties
refresh
* processes.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*
* @return the file system roots.
*/
public static FileProperties[] getRootFileProperties(
long refreshRate, boolean foldersOnly) {
return getRootFileProperties(
FileSystemView.getFileSystemView(), refreshRate, foldersOnly);
}

/**
* Returns a set of FileProperties that are the roots of the given
* <code>FileSystemView</code>.
*
* @param fsView the <Code>FileSystemView</code> where the
* <code>FileProperties</code> will get the file's properties.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*
* @return the file system roots.
*/
public static FileProperties[] getRootFileProperties(
FileSystemView fsView, boolean foldersOnly) {
return getRootFileProperties(fsView, DEFAULT_REFRESH_RATE, foldersOnly);
}


/**
* Returns a set of FileProperties that are the roots of the given
* <code>FileSystemView</code>.
*
* @param fsView the <Code>FileSystemView</code> where the
* <code>FileProperties</code> will get the file's properties.
*
* @param refreshRate the time in milliseconds between two properties
refresh
* processes.
*
* @param foldersOnly indicates, when the file is actually a folder,
whether
* only folders are taken as children.
*
* @return the file system roots.
*/
public static FileProperties[] getRootFileProperties(
FileSystemView fsView, long refreshRate, boolean foldersOnly) {
File[] rootFiles = fsView.getRoots();
FileProperties[] roots = new FileProperties[rootFiles.length];
for (int i=0; i < rootFiles.length; i++) {
roots[i] = new FileProperties(
fsView, rootFiles[i], refreshRate, foldersOnly);
}
return roots;
}

/**
* forces the update of the <code>FileProperties</code>.
*/
public void update() {
updater.stop();
getProperties();
updater.start();
}

/**
* Depending on the <code>foldersOnly</code> parameter, indicates whether
* this <code>File</code> is a leaf.
* @return If foldersOnly was set to true, returns true if this folder
* contains subfolders. Otherwise, returns true if this <code>File</code>
* is actually a file.
*/
public boolean isLeaf() {
return children.length == 0;
}

/**
* indicates the number of children of this <code>File</code>.
* @return the number of children of this <code>File</code>.
*/
public int getChildCount() {
return children.length;
}

/**
* Returns the <code>FileProperties</code> for the child at the given
index.
*
* @param index the index of the requested child.
*
* @return the children of this <code>File</code> at the given position,
* null if the index is out of bounds, I.E. < 0 or >= getChildCount().
*/
public FileProperties getChild(int index) {
FileProperties child;
lockProperties();
/* build the object if required */
if (childrenProperties[index] == null) {
childrenProperties[index] = new FileProperties(
fsView, children[index], refreshRate, foldersOnly);
}
child = childrenProperties[index];
unlockProperties();
return child;
}

/**
*
* @param child the child to search for
* @return the index of the child
*/
public int getIndexOfChild(FileProperties child) {
int index = 0;
while (index < childrenProperties.length &&
child.file != children[index]) {
index++;
}
/** @todo gérer le cas où le child n'est pas trouvé*/
return index;
}

/**
*
* @return the icon for this file.
*/
public Icon getIcon() {
return fileIcon;
}

/**
*
* @return the <code>File</code> as displayed in the
* <code>FileSystemView</code>.
*/
public String getSystemDisplayName() {
return displayName;
}

/**
*
* @return the <code>File</code> whose properties are stored here.
*/
public File getFile() {
return file;
}
/*
======================================================================== Private methods
======================================================================== */
private synchronized void getProperties() {

FileFilter folderFilter = new FileFilter() {
public boolean accept(File pathname) {
return fsView.isTraversable(pathname).booleanValue();
}
};
lockProperties();
// get children
if (fsView.isFloppyDrive(file)) {
/** @todo récuperer les infos pour les floppy si nécessaire */
}
else if (!foldersOnly) {
children = file.listFiles();
}
else
{
File[] allFiles = /*file.listFiles(folderFilter);
*/fsView.getFiles(file, true);
if (allFiles != null) {
int traversables = 0;
for (int i = 0; i < allFiles.length; i++)
if (fsView.isTraversable(allFiles[i]).booleanValue())
traversables++;
children = new File[traversables];
traversables = 0;
for (int i = 0; i < allFiles.length; i++)
if (fsView.isTraversable(allFiles[i]).booleanValue())
children[traversables++] = allFiles[i];
}
}
if (children == null) {
children = new File[] {};
}

// get icon and name
fileIcon = fsView.getSystemIcon(file);
displayName = fsView.getSystemDisplayName(file);

/**
* @todo Mettre a jour la liste des childrenProperties pour ne pas
recréer
* tous les objets du tableau.
*/
childrenProperties = new FileProperties[children.length];

unlockProperties();
}

private synchronized void lockProperties() {
while (lock);
lock = true;
}

private void unlockProperties () {
lock = false;
}
}

FileTreeModel.java:
import java.io.File;
import java.util.Vector;
import javax.swing.tree.*;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.FileSystemView;

/**
* @author C&eacute;dric Bourgeois
* @version 1.0
*/

public class FileTreeModel implements TreeModel {
FileSystemView fsView;
Vector listeners;
FileProperties[] rootFileProperties;

public FileTreeModel() {
fsView = FileSystemView.getFileSystemView();
listeners = new Vector();
rootFileProperties = FileProperties.getRootFileProperties(true);
}

public File createNewFolder(File containingDir) throws java.io.IOException
{
/**@todo Implémenter cette méthode
javax.swing.filechooser.FileSystemView abstract*/
throw new java.lang.UnsupportedOperationException(
"La méthode createNewFolder() n'est pas encore implémentée.");
}

/**
* return the root of all roots.
* @return the object returned is an array of <code>File</code>s whiwh are
* actually the file system roots.
*/
public Object getRoot() {
return rootFileProperties;
}

/**
* returns the subfolder number i of a given folder.
* @param o the parent folder
* @param i the folder number
* @return the subfolder
*/
public Object getChild(Object o, int i) {
// special case: a root
if (o == rootFileProperties)
return rootFileProperties[i];

// default case
return ((FileProperties)o).getChild(i);

}

/**
* returns the number of subfolders in this folder
* @param o this <code>File</code> is the parent folder.
* @return the number of subfolders.
*/
public int getChildCount(Object o) {
// special case: a root
if (o == rootFileProperties)
return rootFileProperties.length;

// default case
return ((FileProperties)o).getChildCount();
}

/**
* indicates whether this folder contains subfolders.
* @param o this <code>File</code> is the parent folder.
* @return <code>true</code> if and only if this folder contains
subfolders.
*/
public boolean isLeaf(Object o) {
// special case: a root
if (o == rootFileProperties)
return false;

// default case
return ((FileProperties)o).isLeaf();
}

public void valueForPathChanged(TreePath path, Object newValue) {
/**@todo Implémenter cette méthode
javax.swing.filechooser.FileSystemView abstract*/
throw new java.lang.UnsupportedOperationException(
"La méthode valueForPathChanged() n'est pas encore implémentée.");
}

public int getIndexOfChild(Object parent, Object child) {
if (parent != rootFileProperties) {
return ( (FileProperties) parent).getIndexOfChild( (FileProperties)
child);
}
else {// special case: a root
int index = 0;
while (index < rootFileProperties.length &&
((FileProperties)child).getFile() ! rootFileProperties[index].getFile()) {
index++;
}
/** @todo gerer le cas ou le child n'est pas trouvé*/
return index;
}
}

public void addTreeModelListener(TreeModelListener l) {
listeners.add(l);
}

public void removeTreeModelListener(TreeModelListener l) {
listeners.remove(l);
}

}

FileTreeCellRenderer.java:

import java.awt.Component;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.filechooser.FileSystemView;

/**
* @author C&eacute;dric Bourgeois
* @version 1.0
*/

public class FileTreeCellRenderer extends DefaultTreeCellRenderer {
public FileTreeCellRenderer(){
}

FileSystemView fsView = FileSystemView.getFileSystemView();

public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {

// call superclass method
super.getTreeCellRendererComponent(
tree, value, sel, expanded, leaf, row, hasFocus);

// set icon and file name
setIcon( ( (FileProperties) value).getIcon());
setText( ( (FileProperties) value).getSystemDisplayName());
setToolTipText(( (FileProperties) value).getFile().getAbsolutePath());

// done
return this;
}
}

FileTree.java

import java.awt.Component;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.*;
import javax.swing.JTree;
import javax.swing.tree.*;

/**
* This component displays the computer's folders tree.<BR>
* <H3>Conception</H3>
* @author C&eacute;dric Bourgeois
* @version 1.1
*/

public class FileTree extends JTree {
static FileSystemView fsView = FileSystemView.getFileSystemView();

public FileTree() {
setModel(new FileTreeModel());
setCellRenderer(new FileTreeCellRenderer());
super.setRootVisible(false);
}

/** @todo constructeur avec refresh rate */
/* public FileTree(long refreshRate) {
setModel(new FileTreeModel());
setCellRenderer(new FileTreeCellRenderer());
super.setRootVisible(false);
}
*/
/**
* This method does nothing.
*/
public void setRootVisible() {
;
}

public static FileSystemView getFileSystemView() {
return fsView;
}
}

Avatar
vclassine
"Ced" wrote in message news:<bp8d7d$go6$...
"Vincent" a écrit dans le message de
news:
J'espère me penché bientôt sur
son optimisation, reste que je ne sais pas si c'est possible de
manière efficace. Si c'est les classes annexes du JFileChooser et pas
ma conception , dommage!!!


Je peux te confirmer que les classes du JFileChooser rament.Si tu t'amuse à
les appeler chaque fois que tu as besoin d'une icône ou a chaque appel d'un
getChild, tu t'en sors plus.
J'en ai fait la dure expérience effectivement, une idée serait

peut-être de ne plus les appeler pour tous les répertoires, mais
effectivement se pose le problème des saloperies MS (bureau...).

Du coup, j'ai fait une classe qui sert de cache pour chaque répertoire, avec
un Timer qui le rafraichit régulièrement. Ca améliore déjà nettement la
navigation. Les problèmes auxquels je suis confrontés:

- lecteur a: Pour afficher le Poste de travail, ma classe va chercher le
contenu du lecteur a: Et avec le refresh, c'est encore plus grave, il y va
toutes les 10 secondes.c'est pas terrible d'entendre le "cloc cloc" du
lecteur toutes les 10 secondes. Sans compter que ca ralentit tout.



Oui j'ai eu le même problème mais je l'avais partiellement résolu, je
vais voir comment j'avais fais. Reste que le cloc cloc et cie n'est
pas le plus grave. Sur certaine machine NT4 ça faisait carrément
planter la VM...


3.
C'est vrai que moi je laissais de côté la gestion de ces trucs (sauf
ceux de premier niveau dans l'arborescence: bureau, poste de travail,
mes documents).
Une première idée serait de ne faire le test "isTraversable" que sur
les fichiers. Mais je me demande si le plus efficace ne serait pas de
faire un peu de code "os dependent". Bref un comportement (peut-être
lent ou fonctionellement incomplet pour tous les OS) et ensuite des
"optimisations/extensions" pour chaque OS, concrètement sous windows
il n'est pas insurmontable de cibler les trucs spécifiques, au moins
lorsque c'est une install "par défaut"...

Je te mets déjà mon code pour que tu puisses te rendre compte, et
éventuellement avancer avec moi.
Ok, merci... Je ne peut pas regarder de suite, mais d'ici 2-3 jours

c'est possible...

J'ai donc 4 classes:
- FileProperties: le cache qui est rafraîchi pour chaque fichier
- FileTreeModel : le model
- FileTreeCellRenderer : pour l'affichage
- FileTree : le composant lui-même
ça correspond à ce que j'avais fait...


Bon, tout n'est pas super commenté, et il y a quelques bridages (le refresh
ne fait rien en fait; les floppy ne sont pas explorables...). Bref, c'est en
chantier.
Je te pardonnes :-)



FileProperties.java:
import java.awt.event.ActionEvent;
...

public static FileSystemView getFileSystemView() {
return fsView;
}
}


ça m'a l'air propre tout ça :-)

Je jette un coup d'oeil dès que possible...