seleccionar personalizar filtro filenameextensionfilter explorador carpeta archivos archivo java swing jfilechooser

java - personalizar - JFileChooser selecciona el directorio pero muestra los archivos



seleccionar archivo jframe (7)

Siento que debería haber una forma simple de hacer esto pero no puedo resolverlo. Tengo un JFileChooser que permite al usuario seleccionar directorios. Quiero mostrar todos los archivos en los directorios para darle un poco de contexto al usuario, pero solo los directorios deben aceptarse como selecciones (tal vez el botón Abrir esté deshabilitado cuando se seleccione un archivo). ¿Hay una manera fácil de hacer esto?


AFAIK JFileChooser separa el filtrado de archivos (lo que se puede ver, muy configurable) del filtrado de selección (lo que se puede elegir).

La configuración del filtrado de selección es mucho más limitada, pero AFAIK puede elegir permitir que solo los archivos o solo los archivos se seleccionen con setFileSelectionMode()


Consulte setFileSelectionMode() en Cómo usar los selectores de archivos :

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)

Anexo: El efecto se puede ver sin comentar la línea 73 de este FileChooserDemo , pero parece ser dependiente de la plataforma.

Anexo: Si usa FILES_AND_DIRECTORIES , considere cambiar el texto del botón en consecuencia:

chooser.setApproveButtonText("Choose directory");

Como el efecto depende de L&F, considere usar DIRECTORIES_ONLY en plataformas que ya cumplan con sus requisitos de UI:

if (System.getProperty("os.name").startsWith("Mac OS X")) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } else { chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); }


Creo que la mejor solución es simplemente permitir que el usuario seleccione un archivo o un directorio. Y si el usuario selecciona un archivo, simplemente use el directorio donde se encuentra ese archivo.


La solución de anular approveSelection puede ser molesta para ciertos usuarios.

A veces, un usuario simplemente hace clic en un archivo de un directorio sin motivo (aunque quiera seleccionar el directorio y no el archivo). Si eso sucede, el usuario quedará (tipo-a) atascado en el JFileChooser ya que la approveSelection , incluso si ella deselecciona el archivo. Para evitar esta molestia, esto es lo que hago:

JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES); int option = fileChooser.showDialog(null, "Select Directory"); if (option == JFileChooser.APPROVE_OPTION) { File f = fileChooser.getSelectedFile(); // if the user accidently click a file, then select the parent directory. if (!f.isDirectory()) { f = f.getParentFile(); } System.out.println("Selected directory for import " + f); }

La selección del directorio, incluso cuando el usuario seleccionó un archivo, da como resultado una mejor usabilidad en mi opinión.


Mantenga el fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) y use:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles();


Mi solución es una combinación entre las respuestas de camickr y trashgod:

final JFileChooser chooser = new JFileChooser() { public void approveSelection() { if (getSelectedFile().isFile()) { return; } else super.approveSelection(); } }; chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );


Reemplace el método approveSelection (). Algo como:

JFileChooser chooser = new JFileChooser( new File(".") ) { public void approveSelection() { if (getSelectedFile().isFile()) { // beep return; } else super.approveSelection(); } };