Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre confirmé
    Inscrit en
    novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : novembre 2004
    Messages : 129
    Points : 280
    Points
    280

    Par défaut [JFileChooser] Limiter la navigation dans une arborescence précise

    Bonjour les gens,

    En fait, j'aimerais ouvrir un JFileChooser dans un répertoire précis (jusque là, pas de problème) mais j'aimerais également que les répertoires et les fichiers qui ne soient pas contenu dans ce répertoire ou un de ses sous-répertoires ne soient pas accessible.

    En gros, si j'affiche mon JFileChooser avec comme répertoire par défaut "C:\foo\fighter" , l'utilisateur puisse acceder aux fichier et aux sous répertoires enfant, tel que le fichier "C:\foo\fighter\torpille.png", mais ne puisse pas acceder aux répertoires "C:\foo", "C:\tata" ou bien encore "D:\".

    Voila, je sais pas si je suis très clair, donc si vous voulez des précision supplémentaires, n'hésitez pas à me les demander.

    Dans l'attente de vos réponses,
    Cordialement,

    Teocali

  2. #2
    Membre chevronné
    Inscrit en
    avril 2003
    Messages
    776
    Détails du profil
    Informations forums :
    Inscription : avril 2003
    Messages : 776
    Points : 790
    Points
    790

    Par défaut

    Bonjour,

    pour filtrer l'affichage d'un JFileChooser il y a FileFilter

  3. #3
    Membre confirmé
    Inscrit en
    novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : novembre 2004
    Messages : 129
    Points : 280
    Points
    280

    Par défaut

    Mais dans le cas présent, je ne suis pas sur qu'il convienne. En effet, un File Filter permet de cacher des fichiers répondant à certaines contraintes, mais je ne crois pas qu'il empêche de remonter dans un répertoire parent via les outils de navigation du File Chooser (la combo box donnant l'arborescence, le bouton qui permet de remonter d'un cran dans l'arborescence, la bar de boutons sur la gauche du dialog, etc.).

    Je précise que je ne suis pas contraint a JFileChooser. Si vous connaissez un autre composant qui me permet de faire ce que j'ai besoin de faire, je sauterais dessus

    Teocali

  4. #4
    Membre chevronné
    Inscrit en
    avril 2003
    Messages
    776
    Détails du profil
    Informations forums :
    Inscription : avril 2003
    Messages : 776
    Points : 790
    Points
    790

    Par défaut

    Rien de l'empeche de remonter d'un repertoire.
    il ne vera que le répertoire "fighter" s'il va dans le repertoire "c:\foo"

  5. #5
    Membre confirmé
    Inscrit en
    novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : novembre 2004
    Messages : 129
    Points : 280
    Points
    280

    Par défaut

    Mouais, éventuellement, ça reste un pis-aller, mais c'est pas propre. Ca risque de bloquer s'il remonter, par exemple, dans C:\, mais je peux faire en sorte qu'il ne puisse accéder qu'aux fichiers de l'arborescence souhaitée.
    Je vais m'orienter vers cette solution, mais si quelqu'un d'autre en voit une "plus propre", qu'il ne se gène pas pour se faire connaitre.

    Merci quand même, fnobb

    Teocali

  6. #6
    Membre chevronné
    Inscrit en
    avril 2003
    Messages
    776
    Détails du profil
    Informations forums :
    Inscription : avril 2003
    Messages : 776
    Points : 790
    Points
    790

    Par défaut

    Ben c'est pareil de "c:" il ne peut voir que le répertoire "foo"

  7. #7
    Expert Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 026
    Points : 20 808
    Points
    20 808

    Par défaut

    Salut,


    En utilisant un FileSystemView perso tu peux cacher toute une partie du système de fichier.
    Par exemple pour utiliser un répertorie comme racine du système de fichier :

    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
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    public class MyFileSystemView extends FileSystemView {
     
    	/** Le FileSystemView par défaut */
    	private final FileSystemView system = FileSystemView.getFileSystemView();
    	/** Le répertoire de base */
    	private final File root;
     
    	/** Constructeur privé */
    	private MyFileSystemView(File root) {
    		// On récupère le chemin canonique du répertoire
    		this.root = root;
    	}
     
    	/** Factory publique */
    	public static JFileChooser createFileChooser(File root) throws IOException {
    		root = root.getCanonicalFile(); // On récupère le chemin canonique
    		if (!root.isDirectory()) {
    			throw new IllegalArgumentException("root must be a directory");
    		}
    		return new JFileChooser(root, new MyFileSystemView(root));
    	}
     
    	@Override
    	public boolean isRoot(File f) {
    		return this.root.equals(f.getAbsoluteFile());
    	}
     
    	@Override
    	public boolean isFileSystemRoot(File dir) {
    		return this.root.equals(dir.getAbsoluteFile());
    	}
     
    	@Override
    	public File[] getRoots() {
    		return new File[] { this.root.getAbsoluteFile() };
    	}
     
    	@Override
    	public File getHomeDirectory() {
    		return this.root.getAbsoluteFile();
    	}
     
    	@Override
    	public File getDefaultDirectory() {
    		return this.root.getAbsoluteFile();
    	}
     
     
    	@Override
    	public File getParentDirectory(File dir) {
    		if(isRoot(dir)) {
    			// Pas de parent director pour le répertoire root :
    			return this.root;
    		}
    		return system.getParentDirectory(dir);
    	}
     
     
    	@Override
    	public File createFileObject(String path) {
    		// Fichier crée lorsqu'on tape le nom directement :
    		// On crée le fichier selon le répertoire root :
    		File file = new File(this.root, path);
    		if (file.exists()) {
    			return file;
    		}
    		// S'il n'existe pas on renvoi root
    		return this.root;
    	}
     
     
    	@Override
    	protected File createFileSystemRoot(File f) {
    		return null;
    	}
     
     
     
    	// Pour tous les autres on se contente d'appeler le FileSystemView par défaut :
     
     
     
    	@Override
    	public File createFileObject(File dir, String filename) {
    		return system.createFileObject(dir, filename);
    	}
     
     
    	@Override
    	public File createNewFolder(File containingDir) throws IOException {
    		return system.createNewFolder(containingDir);
    	}
     
    	@Override
    	public File getChild(File parent, String fileName) {
    		return system.getChild(parent, fileName);
    	}
     
     
     
    	@Override
    	public File[] getFiles(File dir, boolean useFileHiding) {
    		return system.getFiles(dir, useFileHiding);
    	}
     
     
    	@Override
    	public String getSystemDisplayName(File f) {
    		return system.getSystemDisplayName(f);
    	}
     
    	@Override
    	public Icon getSystemIcon(File f) {
    		return system.getSystemIcon(f);
    	}
     
    	@Override
    	public String getSystemTypeDescription(File f) {
    		return system.getSystemTypeDescription(f);
    	}
     
    	@Override
    	public boolean isComputerNode(File dir) {
    		return system.isComputerNode(dir);
    	}
     
    	@Override
    	public boolean isDrive(File dir) {
    		return system.isDrive(dir);
    	}
     
    	@Override
    	public boolean isFileSystem(File f) {
    		return system.isFileSystem(f);
    	}
     
    	@Override
    	public boolean isFloppyDrive(File dir) {
    		return system.isFloppyDrive(dir);
    	}
     
    	@Override
    	public boolean isHiddenFile(File f) {
    		return system.isHiddenFile(f);
    	}
     
    	@Override
    	public boolean isParent(File folder, File file) {
    		return system.isParent(folder, file);
    	}
     
    	@Override
    	public Boolean isTraversable(File f) {
    		return system.isTraversable(f);
    	}
    }
    Ce qui s'utilise comme cela :
    Code :
    1
    2
    	JFileChooser chooser = MyFileSystemView.createFileChooser(new File("ton rep de base"));
    	chooser.showOpenDialog(null);

    Ca devrait marcher correctement...

    a++

  8. #8
    Membre confirmé
    Inscrit en
    novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : novembre 2004
    Messages : 129
    Points : 280
    Points
    280

    Par défaut

    J'aurais du me douter que la solution se trouvait du coté de FileSystem, mais j'aurais jamais pensé à en créer un nouveau. Je teste, et j'edite si ça marche. Merci beaucoup

    EDIT : Ça marche Nickel !!! Merci encore

    Teocali, joie

  9. #9
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 36
    Points : 10
    Points
    10

    Par défaut

    bonjour,
    mais est-ce qu'il y a un moyen de cacher "certaines" dossiers dans cette arborescence???


    Merci pour toute réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •