La clase JFileChooser proporciona un UI para elegir un fichero de una lista. Un selector de ficheros es un componente que podemos situar en cualquier lugar del GUI de nuestro programa. Sin embargo, normalmente los programas los muestran en di�logos modales porque las operaciones con ficheros son sensibles a los cambios dentro del programa. La clase JFileChooser hace sencillo traer un di�logo modal que contiene un selector de ficheros.
Los selectores de ficheros se utilizan comunmente para dos prop�sitos.
- Para presentar una lista de ficheros que pueden ser abiertos por la aplicaci�n.
- Para permitir que el usuario seleccione o introduzca el nombre de un fichero a grabar.
Observa que el selector de ficheros ni abre ni graba ficheros. Presenta un GUI para elegir un fichero de una lista. El programa es responsable de hacer algo con el fichero, como abrirlo o grabarlo.
Como la mayor�a de los programadores s�lo quieren un selector para abrir o para grabar ficheros, la clase JFileChooser proporciona los m�todos convenientes para mostrar estos tipos de selectores de ficheros en un di�logo. Nuestro primer ejemplo, FileChooserDemo.java, ilustra estos usos.

Cuando se pulsa el bot�n Open el programa trae un open file chooser. Cuando se pulsa el bot�n Save el programa trae un save file chooser. Aqu� podemos ver una imagen de un selector de apertura de ficheros.

Aqu� podemos ver el c�digo que crea y muestra el selector de apertura de ficheros.
private JFileChooser filechooser = new JFileChooser(); ... int returnVal = filechooser.showOpenDialog(FileChooserDemo.this);
Por defecto, un selector de ficheros que no haya sido mostrado anteriormente muestra todos los ficheros en el directorio del usuario. Podemos especificarle un directorio inicial utilizando uno de los otros constructores de JFileChooser, o podemos selecccionar el directorio directamente con el m�todo setCurrentDirectory.
El programa de ejemplo utiliza el mismo ejemplar de JFileChooser para mostrar el selector de grabar ficheros. Aqu� tenemos el m�todo actionPerformed para el oyente del bot�n Save.
private JFileChooser filechooser = new JFileChooser(); ... public void actionPerformed(ActionEvent e) { int returnVal = filechooser.showSaveDialog(FileChooserDemo.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = filechooser.getSelectedFile(); log.append("Saving: " + file.getName() + "." + newline); } else { log.append("Save command cancelled by user." + newline); } }
Utilizando el mismo selector de ficheros para abrir y grabar ficheros, el programa consigue estos beneficios.
- El selector recuerda el directorio actual entre usos, por eso los di�logos de abrir y grabar comparten el mismo directorio actual.
- S�lo tenemos que personalizar un selector de ficheros, y nuestra personalizaci�n se aplicar� a las dos versiones, la de apertura y la de grabaci�n.
C�mo hemos podido ver en los fragmentos de c�digo anteriores, los m�todos showXxxxDialog devuelven un entero que indica si el usuario ha seleccionado un fichero. Podemos utilizar el valor de retorno para determinar si realizar o no la operaci�n requerida.
Si el usuario elige un fichero, el c�digo llama a getSelectedFile sobre el selector de ficheros para obtener un ejemplar de File, que representa el fichero elegido. El ejemplo obtiene el nombre del fichero y lo utiliza en un mensaje. Podemos utilizar otros m�todos del objeto File, como getPath o isDirectory, para obtener informaci�n sobre �l. Tambi�n podemos llamar a otros m�todos como delete y rename para cambiar el fichero de alguna forma. Por supuesto, podr�amos leer o grabar el fichero utilizando una de las clases lectoras o escritoras proporcionadas por el JDK.
Si quieres crear un selector de ficheros para una tarea distinta de abrir o grabar, o si quieres personalizar el selector de ficheros, sigue leyendo. Estos excitantes t�picos se describen m�s abajo.
�FileChooserDemo: Toma 2
Echemos un vistazo a FileChooserDemo2.java, una versi�n modificada del ejemplo anterior que utiliza m�s el API JFileChooser. Este ejemplo utiliza un selector de ficheros que ha sido personalizado de varias formas. Al igual que el ejemplo original, el usuario llama al selector de ficheros pulsando un bot�n. Aqu� podmemos ver una imagen del selector de ficheros.

Necesitaremos estos ficheros fuente para ejecutar el ejemplo: FileChooserDemo2.java, ImageFilter.java, ImageFileView.java, y ImagePreview.java.
Cono se ve en la figura, este selector de ficheros ha sido personalizado para una tarea especial (enviar), proporciona un filtro de ficheros seleccionable, utiliza un visor especial de ficheros para ficheros de im�genes, y tiene un accesorio de visualizaci�n que muestra una versi�n reducida del fichero de imagen seleccionado.
El resto de esta p�gina muestra el c�digo que crea y personaliza este selector de ficheros.
�Usar un Selector de Ficheros para una Tarea Personalizada
Como hemos visto, JFileChooser proporciona un m�todo para mostrar un selector de apartura de ficheros y otro m�todo para mostrar un selector para grabar ficheros. En el aspecto y comportamiento Metal, la �nica diferencia entre estos dos selectores es el t�tulo de la ventana del d�alogo y la etiqueta del bot�n "accept".
La clase tiene un tercer m�todo , showDialog, para mostrar un selector de ficheros para una tarea personalizada. Aqu� podemos ver el c�digo de FileChooserDemo2 que muestra el di�logo selector de ficheros para la tarea Send.
JFileChooser filechooser = new JFileChooser(); int returnVal = filechooser.showDialog(FileChooserDemo2.this, "Send");
El primer argumento del m�todo showDialog es el componente padre para el di�logo. El segundo argumento es un String que proporciona tanto el t�tulo de la ventana de di�logo como la etiqueta del bot�n"accept".
De nuevo, el selector de ficheros no hace nada con el fichero seleccionado. El programa es responsable de implementar la tarea personalizada para la que se cre� el selector de ficheros.
�Filtrar la lista de ficheros
Por defecto, un selector de ficheros muestra todos los ficheros y directorios que detecta. Un programa puede aplicar uno o m�s filtros de ficheros a un selector de ficheros para que el selector s�lo muestre algunos de ellos. El selector de ficheros llama al m�todo accept del filtro con cada fichero para determinar si deber�a ser mostrado. Un filtro de ficheros acepta o rechaza un fichero bas�ndose en alg�n criterio como el tipo, el tama�o, el propietario, etc.
JFileChooser soporta tres clases de filtrado. Los filtros se chequean en el orden aqu� listado. Por eso un filtro del segundo tipo solo puede filtrar aquellos ficheros aceptados por el primero, etc.
- Friltrado interno
- El filtrado se configura a trav�s de llamadas a m�todos espec�ficos de un selector de ficheros. Actualmente el �nico filtro interno disponible es para los ficheros ocultos. Se llama a setFileHidingEnabled(true) para desactivar la selecci�n de ficheros ocultos (como aquellos que empiezan con '.' en sistemas UNIX).
- Friltrado controlado por la aplicaci�n
- La aplicaci�n determina los ficheros a mostrar. Se crea una subclase de FileFilter, se ejemplariza, y se utiliza el ejemplar como un argumento para setFileFilter. El selector de fiheros s�lo mostrar� los ficheros que acepte el filtro.
- Filtrado seleccionable por el usuario
- El GUI selector de ficheros proporciona una lista de filtros de la que el usuario puede elegir uno. Cuando el usuario elige un filtro, el selector de ficheros muestra s�lo aquellos ficheros que acepte el filtro. FileChooserDemo2 a�ade un filtro de ficheros personalizado a su lista de filtros seleccionables del selector de ficheros.
filechooser.addChoosableFileFilter(new ImageFilter());
El filtro personalizado se implementa en ImageFilter.java, como una sublcase de FileFilter. La clase ImageFilter implementa el m�todo getDescription para devolver un string y ponerlo en la lista de filtros seleccionables. Como muestra el siguiente c�digo, ImageFilter implementa el m�todo accept para aceptar todos los directorios y cualquier fichero que tenga las extensiones ".jpg", ".jpeg", ".gif", ".tif", or ".tiff".
public boolean accept(File f) { if (f.isDirectory()) { return true; } String s = f.getName(); int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { String extension = s.substring(i+1).toLowerCase(); if (tiff.equals(extension) || tif.equals(extension) || gif.equals(extension) || jpeg.equals(extension) || jpg.equals(extension)) { return true; } else { return false; } } return false; }
Aceptando todos los directorios, este filtro permite al usuario navegar a trav�s del sistema de ficheros. Si se omitieran las l�neas en negrita de este m�todo, el usuario se ver�a limitado al directorio en que se inicializ� el selector de ficheros.
�Personalizar un Visor de Ficheros
Un selector de ficheros presenta una lista de ficheros para elegir uno. En el aspecto y comportamiento Metal, la lista del selector muestra cada nombre de fichero y mustra un peque�o icono que representa si el fichero es un verdadero fichero o un directorio. Podemos personalizar la visi�n de la lista creando una subclase personalizada deFileView, y utilizando un ejemplar de la clase como un argumento al m�todo setFileView. El ejemplo utiliza un ejemplar de ImageFileView como el visor de ficheros para el selector.
filechooser.setFileView(new ImageFileView());
ImageFileView muestra un icono diferente para cada tipo de imagen aceptada por el filtro de im�genes descrito anteriormente.
La clase ImageFileView sobreescribe los cinco m�todos abstractos definidos en FileView.
- String getTypeDescription(File f)
- Devuelve una descripci�n del tipo de fichero. Aqu� podemos ver la implementaci�n e este m�todo en ImageFileView.
public String getTypeDescription(File f) { String extension = getExtension(f); String type = null; if (extension != null) { if (extension.equals("jpeg")) { type = "JPEG Image"; } else if (extension.equals("gif")){ type = "GIF Image"; } else if (extension.equals("tiff")) { type = "TIFF Image"; } } return type; }
- Icon getIcon(File f)
- Devuelve un icono que representa el fichero o su tipo. Aqu� tenemos la implementaci�n de este m�todo en ImageFileView.
public Icon getIcon(File f) { String extension = getExtension(f); Icon icon = null; if (extension != null) { if (extension.equals("jpeg")) { icon = jpgIcon; } else if (extension.equals("gif")) { icon = gifIcon; } else if (extension.equals("tiff")) { icon = tiffIcon; } } return icon; }
- String getName(File f)
- Devuelve el nombre del fichero. La mayor�a de las implementaci�nes de este m�todo deber�an responder null para indicar que el aspecto y comportamiento deber�a imagin�rselo. Otra implementaci�n com�n devuelve f.getName().
- String getDescription(File f)
- Devuelve una descripci�n del fichero. Una implementaci�n com�n de este m�todo devuelve null para indicar que el aspecto y comportamiento deber�a imagin�rselo.
- Boolean isTraversable(File f)
- Devuelve si un directorio es atravesable o no. La mayor�a de las implementaciones de este m�todo deber�an responder null para indicar que el aspecto y comportamiento deber�a imagin�rselo. Algunas aplicaciones podr�an querer avisar al usuario de no descender a ciertos tipos de directorios porque representan documentos compuestos.
La implementaci�n que hace ImageFileView de los m�todos getTypeDescription y getIcon utilizan un m�todo personalizado getExtension.
private String getExtension(File f) { String ext = null; String s = f.getName(); int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { ext = s.substring(i+1).toLowerCase(); } return ext; }
�Proporcionar un acesorio de visionado
El selector de ficheros personalizado en FileChooserDemo2 tiene un accesorio de visionado. Si el �tem seleccionado es una imagen JPEG, TIFF, o GIF, el accesorio de visionado muestra una peque�a imagen del fichero. Si no lo es, el accesorio de visionado est� vac�o.
El ejemplo llama al m�todo setAccessory para establecer un ejemplar de ImagePreview como accesorio de visionado del selector.
filechooser.setAccessory(new ImagePreview(filechooser));
Cualquier objeto que desciende de JComponent puede ser un accesorio de visionado. El componente deber�a implementar paint o paintComponent, y tener un tama�o predeterminado que parezca adecuado en el selector de ficheros.
El selector de ficheros dispara un evento de cambio de propiedad cuando el usuario selecciona un �tem de la lista. Por eso, un programa con accesorio de visionado debe registrarse para recibir estos eventos y actualizarse cada vez que la selecci�n cambie. En el ejemplo, el propio objeto ImagePreview se registra para estos eventos. Esto mantiene en una sola clase todo el c�digo relacionado con el accesorio de visionado.
Aqu� podemos ver la implementaci�n del m�todo propertyChange en el ejemplo, que es el m�todo llamado cuando se dispara un evento de cambio de propiedad.
public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) { f = (File) e.getNewValue(); if (isShowing()) { loadImage(); repaint(); } } }
Este m�todo carga la imagen y redibuja el accesorio de visionado, si SELECTED_FILE_CHANGED_PROPERTY es la propiedad que ha cambiado.
�El API de FileChooser
El API para usar selectores de ficheros se divide en estas gategor�as.
�Crear y Mostrar un Selector de Ficheros
M�todo | Prop�sito |
---|---|
JFileChooser()
JFileChooser(File, FileSystemView) JFileChooser(File) JFileChooser(FileSystemView) JFileChooser(String, FileSystemView) JFileChooser(String) |
Crea un ejemplar de JFileChooser. |
int showOpenDialog(Component)
int showSaveDialog(Component) int showDialog(Component, String) |
Muestra un di�logo modal conteniendo el selector de ficheros. |
�Navegar por la Lista del Selector de Ficheros
M�todo | Prop�sito |
---|---|
void ensureFileIsVisible(File) | Fuerza el fichero indicado a ser visible en la lista de ficheros. |
void setCurrentDirectory(File)
File getCurrentDirectory |
Selecciona u obtiene el directorio cuyos ficheros se est�n mostrando en el selector de ficheros. |
void changeToParentDirectory() | Cambia la lista para mostrar el directorio padre del directorio actual. |
void rescanCurrentDirectory() | Comprueba el sistema de ficheros y actualiza la lista del selector. |
�Personalizar el Selector de Ficheros
M�todo | Prop�sito |
---|---|
JComponent getAccessory()
void setAccessory(JComponent) |
Selecciona u obtiene el accesorio del selector de ficheros. |
void setFileFilter(FileFilter)
FileFilter getFileFilter() |
Selecciona u obtiene el filtro primario del selector de ficheros. |
void setFileView(FileView)
FileView getFileView() |
Selecciona u obtiene el visor de ficheros del selector. |
FileFilter[] getChoosableFileFilters()
void setChoosableFileFilters(FileFilter[]) void addChoosableFileFilter(FileFilter) boolean removeChoosableFileFilter(FileFilter) void resetChoosable(FileFilter) FileFilter getAcceptAllFileFilter() |
Selecciona, obtiene o modifica la lista de filtros seleccionables. |
void setFileHidingEnabled(boolean)
boolean isFileHidingEnabled() |
Selecciona u obtiene si se muestran los ficheros ocultos. |
�Seleccionar Ficheros y Directorios
M�todo | Prop�sito |
---|---|
void setFileSelectionMode(int)
int getFileSelectionMode() boolean isDirectorySelectionEnabled() boolean isFileSelectionEnabled() |
Selecciona el modo de selecci�n de ficheros. Los valores aceptables son FILES_ONLY, DIRECTORIES_ONLY, y FILES_AND_DIRECTORIES. |
void setMultiSelectionEnabled(boolean)
boolean isMultiSelectionEnabled() |
Selecciona u obtiene si se pueden seleccionar varios ficheros a la vez. |
void setSelectedFile(File)
File getSelectedFile() |
Selecciona u obtiene el fichero actualmente seleccionado. |
void setSelectedFiles(File[])
File[] getSelectedFiles() |
Selecciona u obtiene los ficheros actualmente seleccionados. |