¿Cómo restrinjo JFileChooser a un directorio?

Quiero limitar a mis usuarios a un directorio y sus subdirectorios, pero el botón “Directorio principal” les permite navegar a un directorio arbitrario.

¿Cómo debo hacer eso?

Probablemente pueda hacer esto configurando su propio FileSystemView .

En caso de que alguien más lo necesite en el futuro:

 class DirectoryRestrictedFileSystemView extends FileSystemView { private final File[] rootDirectories; DirectoryRestrictedFileSystemView(File rootDirectory) { this.rootDirectories = new File[] {rootDirectory}; } DirectoryRestrictedFileSystemView(File[] rootDirectories) { this.rootDirectories = rootDirectories; } @Override public File createNewFolder(File containingDir) throws IOException { throw new UnsupportedOperationException("Unable to create directory"); } @Override public File[] getRoots() { return rootDirectories; } @Override public boolean isRoot(File file) { for (File root : rootDirectories) { if (root.equals(file)) { return true; } } return false; } } 

Obviamente tendrá que hacer un mejor método de “createNewFolder”, pero esto restringe al usuario a uno o más directorios.

Y úsalo así:

 FileSystemView fsv = new DirectoryRestrictedFileSystemView(new File("X:\\")); JFileChooser fileChooser = new JFileChooser(fsv); 

o así:

 FileSystemView fsv = new DirectoryRestrictedFileSystemView( new File[] { new File("X:\\"), new File("Y:\\") }); JFileChooser fileChooser = new JFileChooser(fsv); 

La solución de Allain está casi completa. Tres problemas están abiertos a resolver:

  1. Al hacer clic en “Inicio”, el botón expulsa al usuario de las restricciones
  2. DirectoryRestrictedFileSystemView no es accesible fuera del paquete
  3. El punto de partida no es Root

  1. Agregar @Override a DirectoryRestrictedFileSystemView

public TFile getHomeDirectory() { return rootDirectories[0]; }

  1. establecer clase y constructor public

  2. Cambiar JFileChooser fileChooser = new JFileChooser(fsv); en JFileChooser fileChooser = new JFileChooser(fsv.getHomeDirectory(),fsv);

Lo uso para restringir a los usuarios a permanecer en un archivo comprimido a través de TrueZips TFileChooser y con ligeras modificaciones al código anterior, esto funciona perfectamente. Muchas gracias.

No es necesario que sea tan complicado. Puede establecer fácilmente el modo de selección de un JFileChooser como este

 JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.setMultiSelectionEnabled(false); 

Puede leer más referencia aquí Cómo usar File Choosers