2010-05-21 14 views
16

Siento que debería haber una manera 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 dar contexto al usuario, pero solo los directorios deben aceptarse como selecciones (tal vez el botón Abrir se desactivará cuando se seleccione un archivo). ¿Hay una manera fácil de hacer esto?JFileChooser selecciona el directorio pero muestra los archivos

Respuesta

12

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

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

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 de filtrado de la selección es mucho más limitado, pero que sabemos, se puede optar por permitir que sólo los directorios o sólo los archivos que se seleccionan con setFileSelectionMode()

-1

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

+0

bastante pobre UX. –

13

Ver setFileSelectionMode() en How to Use File Choosers:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 

Adición: El efecto se puede ver por la línea 73 del presente descomentando FileChooserDemo, pero parece ser dependiente de la plataforma.

Adición: Si se utiliza FILES_AND_DIRECTORIES, considere cambiar el texto del botón en consecuencia:

chooser.setApproveButtonText("Choose directory"); 

Como el efecto es L & F dependiente, considere el uso de DIRECTORIES_ONLY en plataformas que ya cumplen con los requisitos de interfaz de usuario:

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

Pero eso ocultará archivos, que es lo que él no quiere. –

+0

@mmyers: Muestra los archivos en gris en el ejemplo citado anteriormente. YMMV – trashgod

+0

Según lo que dice el tutorial, parece que depende de laf. –

17

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

+1

+1 ¡Parece que estoy en buena compañía! Actualicé mi respuesta para reflejar este enfoque combinado. – trashgod

+1

¡Muy bien! 'JFileChooser.FILES_AND_DIRECTORIES' es ** importante **! Sin él, (como en la respuesta de 'camickr') la solución es ** inútil **, como probé. –

2

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

A veces, un usuario simplemente hace clic en un archivo en un directorio sin ninguna razón (a pesar de que desea seleccionar el directorio y no el archivo). Si eso sucede, el usuario estaría (kind-a) atrapado en el JFileChooser ya que el approveSelection fallará, incluso si anula la selección del 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); 
} 

Selección del directorio, incluso cuando el usuario selecciona un archivo resulta en una mejor usabilidad en mi opinión.

0

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

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