Network chooser à partir d'un JFileChooser

klod50
Network chooser à partir d'un JFileChooser

Bonjour à tous.
J'aurai voulu savoir s'il était possible de limiter un JFileChooser à un accès réseau. J'aimerai que l'utilisateur ne puisse accéder qu'au répertoire des machines sur le réseau dans lequel il se trouve. Mais je ne veux pas qu'il puisse accéder aux fichiers de la machine locale.
J'ai chercher un peu partout et je n'ai pas trouver comment faire.
Est-ce que quelqu'un aura

Niroken

Hello,

Même si je ne vois pas trop l'intérêt de ta manoeuvre, je pense
qu'ile xiste une solution : (que je n'ai pas testé ceci dit)

D'après ce tuto java : http://java.sun.com/docs/books/tutorial/uiswing/components/filechooser.html

tu peux faire :

JFileChooser fc = new JFileChooser();
...
fc.setFileFilter(new NetworkOnlyFileFilter());

où la classe NetworkOnlyFileFilter est une classe que tu auras crée qui hérites de FileFilter, il te suffit de surcharger les méthods accept()
et getDescription(), bien que je ne suis pas sur que tu aies besoin de getDescription() ici.

Bonne chance,
Niroken

klod50

Je vois très bien ce que tu veux dire et je veux bien croire que ça peut marcher. Mais il me semble qu'il faut aussi indiquer au FileChooser un chemin root au chargement de la page et ce chemin root n'a pas d'existence physique (voisinage réseau) mais correspond à un répertoire virtuel de windows. C'est plutot à ce niveau là que j'ai un problème
Klod

klod50

C'est bon j'ai trouvé. Alors, en fait, le but du jeu était de trouver le chemin du répertoire virtuel "Voisinage Réseau" géré par windows afin de l'ajouter en tant que répertoire root du fileSystemView du JFileChooser. Pour celà, j'utilise la classe ShellFolder de java.
Voilà le bout de code :

// récupère tous les répertoires particuliers de windows
File[] files = (File[])ShellFolder.get("fileChooserComboBoxFolders");
File root = null;

for (int i = 0; i < files.length; i++) {
       // NETWORK_NEIGHBOURHOOD = "::{208D2C60-3AEA-1069-A2D7-08002B30309D}" : c'est la valeur du répertoire dans la base de registre	
       if (files[i].getName().equals(NETWORK_NEIGHBOURHOOD))
       {
              root = files[i];
              break;
       }
}

Et voilà, il n'y a plus qu'à crée un JFileChooser avec ce fichier en tant que root et vous aurez un FileChooser qui ne vous permettra que d'accéder au favoris réseau et au voisinage réseau.

fredericmazue

Quote:
Pour celà, j'utilise la classe ShellFolder de java

Et d'où sort-elle cette classe Java ?
De derrière des fagots d'arbres à café ? :)

Ca serait pas des fois une classe des packages sun.awt et compagnie ? Si oui, c'est bien que ça résolve ton problème aujourd'hui, mais dois savoir que tu ne peux pas compter sur la pérénité de cette classe dans l'avenir, ni même d'une JVM à l'autre, et ni même sur son existence si la JVM n'est pas de chez Sun.

klod50

C'est pas la peine d'être agressif comme ça. Si tu trouves que ma solution n'est pas convenable, donnes m'en une autre parce que ça fait 1 semaine que je cherche et c'est la seule solution que j'ai trouvé.
A bon entendeur

Niroken

Hello,

Je vais mettre mon grain de sel mais je me pose une question....

Avec ta méthode énoncée plus haut on récupère en effet le dossier virtuel "voisinage réseau" et on le set en root dans le FileChooser.

Pour le setter en root j'ai fait :
JFileChooser vFileChooser = new JFileChooser(root);
pour reprendre ton exemple, or avec ça, le dossier sur lequel on arrive est bien voisnage réseau mais rien n'empeche l'utilisateur de revenir sur le bureau via la combobox ou alors le bouton "home".

Or comme j'ai bien envie de connaitre le dénouement de l'histoire, je voudrais savoir comment tu as fait :)

Cordialement,
Niroken

sylvain.saurel

klod50 wrote:
C'est pas la peine d'être agressif comme ça. Si tu trouves que ma solution n'est pas convenable, donnes m'en une autre parce que ça fait 1 semaine que je cherche et c'est la seule solution que j'ai trouvé.
A bon entendeur

Il te dit pas ça pour être désagréable ...

Il te fait simplement remarquer que les classes provenant de ces packages ont un avenir plus qu'incertain au sein du package standard de java.

Du coup, il se peut très bien que lors d'une prochaine release de Java, elles disparaissent et que ton programme ne fonctionne plus à ce moment-là.

Après, il se peut que cela ne te gêne pas de limiter ton programme à certaines implémentations de la JVM ou certaines versions de Java. Mais c'est bien d'avoir ça en tête quand tu utilises ces classes ...

klod50

C bon c bon je prends pas la mouche. Je dis juste qu'il y a des façons de le dire.
Enfin bref, pour Niroken, en fait je créé un nouveau FileSystemView qui prend en répertoire root le répertoire que je lui passe en paramètre. De ce fait, on ne peut pas accéder aux autres répertoires.

fredericmazue

Comme dit sylsau, merci à lui, je n'ai pas du tout voulu être désagréable en effet.
Des façons de le dire ? Je sais pas ... j'ai beau relire mon post je n'arrive pas à voir où j'ai été agressif.
Bon je saurai à l'avenir qu'il vaut mieux ne rien dire plutôt que de passer du temps pour essayer d'aider ou apporter une information à klod50.

Niroken

Quote:
Enfin bref, pour Niroken, en fait je créé un nouveau FileSystemView qui prend en répertoire root le répertoire que je lui passe en paramètre. De ce fait, on ne peut pas accéder aux autres répertoires.

Ouki merci :)