Icone systeme d'un fichier de répertoire distant

Bonjour à tous,

Je travaille actuellement sur un client FTP en JAVA, et je me heurte au problème suivant :
J’ai deux JList, une pour l’arborescence du serveur, l’autre pour celle du client. Pour ce qui est du client j’arrive à afficher l’icone correspondante du fichier avec getSystemIcon(fichier), par contre pour les icones des fichiers du serveur c’est une autre affaire. Je ne peux pas utiliser cette méthode car le fichier doit exister sur le disque pour qu’elle fonctionne (FileNotFoundException).

J’ai pensé à créer des fichiers vides sur le disque pour récupérer leurs icones mais cette méthode me semble un peu dégueulasse, y a-t-il un moyen plus propre de récupérer les icones des fichiers contenus dans un répertoire distant ?

merci de vos réponses, s’il y en a =) et bonnes fêtes à tous.


JTable pas JLilst pardon,

voilà en prime un petit screen pour que ce soit bien clair, à droite le repertoire client, à gauche le repertoire du serveur :

Pour Windows, c’est normal: l’icône d’un fichier, c’est celle par
défaut, ou celle de l’application sélectionnée. Quand tu fais un
getSystemIcon, il ne fait rien de plus qu’aller demander au système
de fichier les paramètres ad hoc.

Pour ton cas, maintenant, ce que tu dois faire c’est analyser
l’extension du système distant, et lui assigner une icône. Tu peux
par exemple faire un fichier properties, dans ce genre:

pdf=pdf.png

Tu stocke le fichier, et les icônes, au même endroit que ta classe
(ou pas, je te laisse créer un dossier) :

Puis dans ta fonction perso:


class FileSystemViewHelper {
private final static DIRECTORY_ICON = new ImageIcon(FileSystemViewHelper.class.getResource("directory.png"));
private final static DEFAULT_ICON     = new ImageIcon(FileSystemViewHelper.class.getResource("default.png"));
private final static Map<String, ? extends Icon> icons = new Map<String, ? extends Icon>();
private final static Properties properties = new Properties();
static {
  properties.load(FileSystemViewHelper.class.getResourceAsStream("extmap.properties");
}

...

public static Icon getDistantSystemIcon(String path) {
  if (isDirectory(path)) {
    return DIRECTORY_ICON;
  } 
  int i = path.lastIndexOf(".");
  if (i == -1) {
    return DEFAULT_ICON;
  }
  String extension = path.substring(i+1).toLowerCase;

  synchronized (icons) {
    Icon icon = icons.get(extension);
    if (icon == null) { 
      String filename = properties.get(extension);
      if (null == filename) {
        icons.put(extension, DEFAULT_ICON);
      } else {
        URL url = FileSystemViewHelper.class.getResource(filename);
        if (url == null) {
          icons.put(extension, DEFAULT_ICON);
        } else {
          icons.put(extension, new ImageIcon(url));
        }
      }
      icon = icons.get(extension);
    }
    return icon;
  }
}

Ca, c’est une première solution mais qui a une faille : ça n’affichera pas les bonnes icônes dans le système distant (exemple: tu ouvres les fichiers html avec Fx au lieu de cette bouse d’IE). L’autre solution consiste à interroger le shell, mais je ne sais pas comment tu pourrais faire.

J’ai pensé à cette solution en effet, et je l’avais rejetée justement pour avoir un truc aussi “personnalisé” que possible, justement grace au shell. Je me rabatrais là dessus pour le cas où je ne trouve pas d’autre solution, ça fait tout de même bien moins bricolage que créer des fichiers temporaires vides.

En fait je me base sur l’interface de FlashFXP qui pour moi semble parfaite, et si eux ont pu le faire, quel que soit le langage utilisé, c’est que ça doit être possible non ? ^^

Merci en tout cas pour ton aide et pour la classe ça me sauve pas mal de temps si jamais je me rabats là dessus !

Si d’autres personnes ont d’autres idées je suis aussi preneur.

Si c’est en C/C++ tu dois avoir accès aux API de Windows, qui te le permettent.

Là, tu es en Java. Tu as les contraintes de Java.

Finalement la solution réside certainement dans JDIC, développé par SUN, il permet entre autre de récupérer une icone grace à une extention ou un type MIME.

jdic.dev.java.net…