Como usar el componente JFileChooser en una aplicación gráfica en Java

java_base_web

Hola a todos, hoy os explicare como podemos usar el componente JFileChooser en una aplicación gráfica en Java.

La clase JFileChooser nos permite acceder a nuestro sistema de ficheros y seleccionar ficheros. Esto nos puede ser útil para abrir fichero que contengan alguna información útil para nuestra aplicación o incluso para guardar información en ficheros.

Vamos a ver como funciona paso a paso, primero vamos a crear una ventana simple con un campo de texto, un botón y un área de texto (con scroll).

Aquí os dejo el código:

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;

public class EjemploJFileChooser extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextArea textArea;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EjemploJFileChooser frame = new EjemploJFileChooser();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EjemploJFileChooser() {

		//Parametros asociados a la ventana
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setLayout(null);
		setContentPane(contentPane);

		textField = new JTextField();
		textField.setToolTipText("Inserta la ruta del fichero de audio");
		textField.setBounds(52, 26, 209, 20);
		contentPane.add(textField);
		textField.setColumns(10);

		JButton btnSeleccionar = new JButton("Seleccionar...");
		btnSeleccionar.setBounds(288, 25, 109, 23);
		contentPane.add(btnSeleccionar);

		textArea = new JTextArea();
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		textArea.setBounds(52, 76, 360, 156);

		JScrollPane scroll=new JScrollPane(textArea);
		scroll.setBounds(52, 76, 360, 156);
		contentPane.add(scroll);

		btnSeleccionar.addActionListener(new ActionListener(){
			public void actionPerformed (ActionEvent e){

			}
		});

	}
}

Así quedaría:

ejemplo jfilechooser Los siguientes bloques de código que veras, son para copiar en el evento del botón, ya que veremos muchas versiones. Primero crearemos un objeto de JFileChooser, lo podemos crear sin parámetros o una ruta por defecto indicada con un String o un File.

Después invocamos el método showOpenDialog(contentPane) que nos devolverá un int, para saber que opción realiza el usuario. Tenemos las siguientes constantes:

  • JFileChooser.CANCEL_OPTION: Si el usuario pulsa en cancelar.
  • JFileChooser.APPROVE_OPTION: Si el usuario pulsa en aceptar
  • JFileCHooser.ERROR_OPTION: Si ocurre algún error.

La que nos interesa es JFileChooser.APPROVE_OPTION, después podemos copiar la ruta de ese fichero con el método getSelectedFile(); se guardara en un objeto File.

Esta ruta la podríamos guardar en el campo de texto, también podríamos hacer que escribiera el contenido del texto en el textarea.

Veamos como queda de momento:

//Creamos el objeto JFileChooser
JFileChooser fc=new JFileChooser();

//Abrimos la ventana, guardamos la opcion seleccionada por el usuario
int seleccion=fc.showOpenDialog(contentPane);

//Si el usuario, pincha en aceptar
if(seleccion==JFileChooser.APPROVE_OPTION){

	//Seleccionamos el fichero
	File fichero=fc.getSelectedFile();

	//Ecribe la ruta del fichero seleccionado en el campo de texto
	textField.setText(fichero.getAbsolutePath());

	try(FileReader fr=new FileReader(fichero)){
		String cadena="";
		int valor=fr.read();
		while(valor!=-1){
			cadena=cadena+(char)valor;
			valor=fr.read();
		}
		textArea.setText(cadena);
	} catch (IOException e1) {
		e1.printStackTrace();
	}
}

En el caso anterior, solo funcionaria con ficheros legibles, no con otros tipos de ficheros, si queremos que solo se puedan seleccionar los ficheros legibles como los txt, deberemos crear un objeto de la clase FileNameExtensionFilter, le pasaremos un String con la descripción del filtro y después las extensiones en forma de string, un String por extensión. Este código lo añadimos, después de crear el objeto JFileChooser:

//Creamos el filtro
FileNameExtensionFilter filtro = new FileNameExtensionFilter("*.TXT", "txt");

//Le indicamos el filtro
fc.setFileFilter(filtro);

Así es como lo vemos: ejemplo filtro

Por defecto, JFileChooser solo nos permite elegir ficheros, si queremos elegir solo directorios o ambos, usaremos el método setFileSelectionMode(int mode), también tenemos constantes para ello:

  • JFileChooser.FILES_ONLY: solo ficheros.
  • JFileChooser.DIRECTORIES_ONLY: solo directorios.
  • JFileChooser.FILES_AND_DIRECTORIES: ficheros y directorios.

Por ejemplo:

//Creamos el objeto JFileChooser
JFileChooser fc=new JFileChooser();

//Indicamos lo que podemos seleccionar
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

//Creamos el filtro
FileNameExtensionFilter filtro = new FileNameExtensionFilter("*.TXT", "txt");

//Le indicamos el filtro
fc.setFileFilter(filtro);

//Abrimos la ventana, guardamos la opcion seleccionada por el usuario
int seleccion=fc.showOpenDialog(contentPane);

//Si el usuario, pincha en aceptar
if(seleccion==JFileChooser.APPROVE_OPTION){

	//Seleccionamos el fichero
	File fichero=fc.getSelectedFile();

	//Ecribe la ruta del fichero seleccionado en el campo de texto
	textField.setText(fichero.getAbsolutePath());

	try(FileReader fr=new FileReader(fichero)){
		String cadena="";
		int valor=fr.read();
		while(valor!=-1){
			cadena=cadena+(char)valor;
			valor=fr.read();
		}
		textArea.setText(cadena);
	} catch (IOException e1) {
		e1.printStackTrace();
	}
}

También podemos seleccionar una serie de ficheros con el método setMultiSelectionEnabled(true); lo insertaremos después de crear el objeto. Debemos tener en cuenta, que para almacenar los seleccionados usaremos un array de Files y en lugar de usar el método getSelectedFile(); usaremos el método getSelectedFiles();.

Cambiaremos algunas cosas ahora, el campo de texto no lo usaremos:

//Creamos el objeto JFileChooser
JFileChooser fc=new JFileChooser();

//Indicamos que podemos seleccionar varios ficheros
fc.setMultiSelectionEnabled(true);

//Indicamos lo que podemos seleccionar
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

//Creamos el filtro
FileNameExtensionFilter filtro = new FileNameExtensionFilter("*.TXT", "txt");

//Le indicamos el filtro
fc.setFileFilter(filtro);

//Abrimos la ventana, guardamos la opcion seleccionada por el usuario
int seleccion=fc.showOpenDialog(contentPane);

//Si el usuario, pincha en aceptar
if(seleccion==JFileChooser.APPROVE_OPTION){

	//Seleccionamos el fichero
	File[] ficheros=fc.getSelectedFiles();

	for(int i=0;i<ficheros.length;i++){
		try(FileReader fr=new FileReader(ficheros[i])){
			String cadena="";
			int valor=fr.read();
			while(valor!=-1){
				cadena=cadena+(char)valor;
				valor=fr.read();
			}
			textArea.append(cadena+"\n");
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

Por último, veremos como guardar texto en lugar de abrirlo, el campo de texto no lo usaremos, el textarea contendrá el texto del fichero. Usaremos el método showSaveDialog(contentPane); para guardar el fichero, recuerda escribir el nombre del fichero.

//Creamos el objeto JFileChooser
JFileChooser fc=new JFileChooser();

//Abrimos la ventana, guardamos la opcion seleccionada por el usuario
int seleccion=fc.showSaveDialog(contentPane);

//Si el usuario, pincha en aceptar
if(seleccion==JFileChooser.APPROVE_OPTION){

	//Seleccionamos el fichero
	File fichero=fc.getSelectedFile();

	try(FileWriter fw=new FileWriter(fichero)){

		//Escribimos el texto en el fichero
		fw.write(textArea.getText());

	} catch (IOException e1) {
		e1.printStackTrace();
	}

}

En netBeans, tendreis que hacer lo mismo. También hay un componente por si lo quereis poner directamente en un JFrame.

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Etiquetas

7 comments

  1. Hola , he utilizado el JFileChosser y funciona perfectamente para aplicaciones donde el cliente y el servidor estan en la misma maquina , el problema es cuando el servidor y el cliente estan en maquinas distintas , es decir el cliente quiere guardar un archivo y le da click en guardar pero nunca le aparece el cuadro de dialogo ya que este cuadro de dialogo le aparece en la maquina del servidor , podrias ayudarme como se puede hacer para que el cuadro de dialogo aparesca en el lado del usuario es decir del cliente.

  2. Debes colocar el código en la parte del cliente. Un saludo.

  3. […] Como usar el componente JFileChooser en una aplicación gráfica en Java | Disco Duro de Roer. Hola a todos, hoy os explicare como podemos usar el componente JFileChooser en una aplicación gráfica en Java. La clase JFileChooser nos permite acceder a nuestro sistema de ficheros y seleccionar ficheros. Esto nos puede ser útil para abrir fichero que contengan alguna información útil para nuestra aplicación o incluso para guardar información en ficheros. Vamos a ver como funciona paso a paso, primero vamos a crear una ventana simple con un campo de texto, un botón y un área de texto (con scroll). Aquí os dejo el código: Así quedaría: Los siguientes bloques de código que veras, son para copiar en el evento del botón, ya que veremos muchas versiones. Después invocamos el método showOpenDialog(contentPane) que nos devolverá un int, para saber que opción realiza el usuario. […]

  4. Hola, como hago para cargar un archivo pdf con Jfilechooser y luego ese mismo archivo enviarlo por Javamail a un correo

  5. Hola buenas, ¿no puedo poner una ruta por defecto al jFileChooser?

  6. Me aparece este error: Untested Windows version 10.0 detected!

  7. Hola! He. Usado el jfilechooser, y me carga correctamente el archivo que necesito, solo tengo un problema y es que ya estando cargado un archivo el programa mee permite cargar otro, cómo hago para que cuando el usuario quiera cargar un nuevo archivo lo reemplace por el que ya existía, gracias enserio, me estoy volviendo loco con este problema.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *