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:
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);
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.
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.
Debes colocar el código en la parte del cliente. Un saludo.
Hola, como hago para cargar un archivo pdf con Jfilechooser y luego ese mismo archivo enviarlo por Javamail a un correo
Hola buenas, ¿no puedo poner una ruta por defecto al jFileChooser?
Me aparece este error: Untested Windows version 10.0 detected!
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.
olle tengo una duda si lo que quiero es crear y guardar un archivo, el codigo es el mismo para ambos.
fijate bien, lo unico que cambia es el metodo al que llamas, uno es openDialog y otro saveDialog
Muchas gracias, que haríamos los estudiantes sin estos tutoriales. Muy bien explicado de verdad
Grasias