Bonjour,

Je souhaite utiliser un JFileChooser dans mon application afin de limiter l'accès des utilisateurs à certaines sous-parties de l'arboresence disque.
Pour ce faire, j'ai fait mon propre FileSystemView à partie de codes trouvés sur internet.
Cependant, il me semble qu'aucune des méthodes de mon FileSystemView ne soit appelée notament getRoots(), isRoot() et d'autres fonctions qui permettent justement de décrire le comportment voulu.
Je vous joins le code source :

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
import java.io.File;
import java.io.IOException;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;
 
public class MultiRootedFileSytemView extends FileSystemView {
 
    private final File[] fsRoots;
    private final File homeFile;
    private final FileSystemView system = FileSystemView.getFileSystemView();
 
    private MultiRootedFileSytemView(File home, File[] roots) {
        this.fsRoots = roots;
        this.homeFile = home;
    }
 
    public static JFileChooser createFileChooser(final File home, final File[] roots) {
        if (!home.isDirectory()) {
            throw new IllegalArgumentException("root must be a directory");
        }
 
        JFileChooser fc = new JFileChooser(home, new MultiRootedFileSytemView(home, roots));
        fc.setAcceptAllFileFilterUsed(false);
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        return fc;
    }
 
    @Override
    public File getHomeDirectory() {
        System.out.println("On récupère le home");
        return homeFile;
    }
 
    @Override
    public File[] getRoots() {
        System.out.println("oN RECUPERE LES ROOTS");
        return fsRoots;
    }
 
 
 
    @Override
    public boolean isRoot(File file) {
        System.out.println("On commence a regarder les filesystems root");
        for (File rootFile : fsRoots) {
            if (rootFile.getName().equals(file.getName())) {
                System.out.println(file + " est une racine (isRoot)");
                return true;
            }
        }
        return false;
    }
 
    @Override
    public boolean isFileSystemRoot(File file) {
        System.out.println("On commence a regarder les filesystems root");
        for (File rootFile : fsRoots) {
            if (rootFile.getName().equals(file.getName())) {
                System.out.println(file + " est une racine (isFileSystemRoot)");
                return true;
            }
        }
        return false;
    }
 
    @Override
    public File getDefaultDirectory() {
        return this.homeFile;
    }
 
    @Override
    public File getParentDirectory(File dir) {
        if (isRoot(dir)) {
            return dir;
        }
        return super.getParentDirectory(dir);
    }
 
    @Override
    public File createFileObject(String path) {
        File file = new File(this.homeFile, path);
        if (file.exists()) {
            return file;
        }
        return this.homeFile;
    }
 
    @Override
    protected File createFileSystemRoot(File f) {
        return null;
    }
 
    @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);
    }
}

Et le code appellant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
 JFileChooser fc = MultiRootedFileSytemView.createFileChooser(destDirectory, getWritableFileSystemRoots());
fc.showOpenDialog(this);
La fenetre de dialogue apparait bien.
Le JFileChooser est bien placé dans le bon répertoire.

MAIS :
- l'utilisateur a la possibilité de remonter au dela des racines définies dans le fileSystemView
- La listbox qui présente l'arboresence actuel montre le path complet jusqu'a la racine ("/") et permet aussi de remonter l'arboresence.
- Les methodes du FileSystemView ne sont jamais appellées.
- Je ne vois nul part sur le composant graphique la mention des autres racines passées au filesystemview.

J'utilise la jdk 1.6 de sun et je suis sous linux.

J'ai aussi essayé avec un FileSystemView avec une seule racine, mais ca ne fonctionne pas mieux.

Si vous avez quelques idées ou besoin d'informations supplémentaires, je suis preneur !