IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

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


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut [JFileChooser] Limiter la navigation dans une arborescence précise
    Bonjour à tous,

    Alors je pense que ce que je cherche à faire est assez clair, sachant qu'en plus j'ai trouvé une solution ici. Cependant, j'ai un problème, à savoir que lorsque je sélectionne un fichier qui ne se trouve pas dans le répertoire racine mais dans un sous-répertoire, le double clic sur le fichier fonctionne bien mais pas le bouton pour ouvrir.

    Voici mon code en une petite classe self-compilable qui illustre mon besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    import java.io.File;
    import java.io.IOException;
    import javax.swing.Icon;
    import javax.swing.JFileChooser;
    import javax.swing.filechooser.FileSystemView;
     
    public class JFileChooserTest {
     
        private static JFileChooser fileChooser;
        private static final File rootDirectory = FileSystemView.getFileSystemView().getHomeDirectory();
     
        public static void main(String[] args) throws IOException {
            fileChooser = MyFileSystemView.createFileChooser(rootDirectory);
            int result = fileChooser.showOpenDialog(null);
            File file = null;
            if (result == JFileChooser.APPROVE_OPTION) {
                file = fileChooser.getSelectedFile();
            }
     
            System.out.println("ChosenFile: " + file);
        }
     
        protected static 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);
            }
        }
     
    }
    Ma question: est-ce que c'est un bug Java ou est-ce que le FileSystemView est mal utilisé ?
    Si quelqu'un a une solution je suis preneur !

    En vous remerciant d'avance pour votre contribution !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si tu traces l'éxécution de createFileObject() tu veras que dans le cas de clic sur le bouton ouvrir, on passe par cette méthode pour déterminer le chemin de fichier : or ici, on créé un fichier avec un new File(root, path), au lieu de new File( dossier actuelle sélectionné, path). En gros si tu sélectionnes un fichier toto.txt dans le dossier truc/ et que la root est c:/temp, alors le nom du fichier est c:/temp/toto.txt au lieu de c:/temp/truc/toto.txt : ensuite on teste l'existence du fichier, et comme ce n'est pas le cas on retourne root, au lieu du nom du fichier. Reste à voir comment connaitre le dossier actuellement sélectionné.

    Si dans le code de cette méthode on test en mettant en dur le nom du dossier courant à la place de root, ça fonctionne avec "ouvrir". Malheureusement pour toi, c'est le composant d'UI qui sait comment récupérer cette information, selon l'UI utilisé, ou éventuellement des classes et méthodes non accessible (getShellFolder()).

    Essayes plutôt simplement avec ça (j'ai pas tout testé et j'ai pas forcément compris quelles limites tu voulais avoir)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public static class MyFileSystemView extends FileSystemView
    	{
    		final File root;
    		final File[] roots;
     
    		public MyFileSystemView (File root)
    		{
    			super();
    			this.root = root;
    			roots = new File[]{this.root};
    		}
     
    		@Override
    		public File createNewFolder(File containingDir) throws IOException {
    			return FileSystemView.getFileSystemView().createNewFolder(containingDir);
    		}
     
    		@Override
    		public File getDefaultDirectory() {
    			return root;
    		}
     
    		@Override
    		public File getHomeDirectory() {
    			return root;
    		}
     
    		@Override
    		public File[] getRoots() {
    			return roots;
    		}
    	}
    Et pour créer le dialogue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
       JFileChooser fileChooser = new JFileChooser();
     
       File myroot = new File("c:/temp"); 
       fileChooser.setFileSystemView(new MyFileSystemView( myroot ));
       fileChooser.updateUI();
       fileChooser.setCurrentDirectory(myroot);
       int result = fileChooser.showOpenDialog(null);
       File file = null;
       if (result == JFileChooser.APPROVE_OPTION) {
          file = fileChooser.getSelectedFile();
       }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Salut,

    En fait j'avais bien remarqué que cette méthode me posait et j'avais déjà tenté de la supprimer mais je ne sais pas pourquoi je n'obtenais pas le résultat escompté alors qu'en réessayant plus tard, j'ai fini par l'avoir !
    Mon but en gros était tout simplement de chrooter l'utilisateur dans son home directory.

    Donc c'est résolu, merci !

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A noter, toutefois, que rien n'empêche l'utilisateur de saisir un chemin en dur (ou qui n'existe pas) : il faudra tester le chemin sélectionné après sélection, pour voir si son absolute path commence bien par l'absolute path de ton root, pour empêcher l'utilisateur de contourner la limitation.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/12/2012, 23h52
  2. Repérer un dossier dans une arborescence
    Par Feustine dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2005, 13h54
  3. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 15h39
  4. navigation dans une jsp avec javascript
    Par petitelulu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/11/2004, 18h55
  5. Suppression d'item dans une arborescence
    Par jonzuzu dans le forum MFC
    Réponses: 2
    Dernier message: 24/02/2004, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo