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

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:

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:

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:

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:

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:

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.

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.

Compartir

3 comentarios

  1. Kevin

    Hola tengo una duda, tengo un error cuando quiero guardar un archivo modificado o creado. El detalle esta, en que si modifico un archivo existente o guardo uno nuevo, este archivo modificado o archivo nuevo se guarda vacío; no se guarda con lo que debe de tener.
    Adjunto el código del método guardar, el cual mando a llamar desde un botón:

    JFileChooser selector=new JFileChooser();
    selector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    FileNameExtensionFilter filtrotxt = new FileNameExtensionFilter(«Archivos TXT»,»txt»);
    FileNameExtensionFilter filtrojava = new FileNameExtensionFilter(«Archivos JAVA»,»java»);
    FileNameExtensionFilter filtrocpp = new FileNameExtensionFilter(«Archivos C++»,»cpp»);
    FileNameExtensionFilter filtroWord = new FileNameExtensionFilter(«Archivos de Word»,»docx»,»doc»);
    FileNameExtensionFilter filtroPowerPoint = new FileNameExtensionFilter(«Archivos de PowerPoint»,»pptx»,»ppt»);
    FileNameExtensionFilter filtroExcel = new FileNameExtensionFilter(«Archivos de Excel»,»xlsx»,»xlsm»);
    FileNameExtensionFilter filtroImagen = new FileNameExtensionFilter(«Imagenes»,»docx»,»png»,»jpg»);
    FileNameExtensionFilter filtroPDF = new FileNameExtensionFilter(«Archivos PDF»,»pdf»);
    FileNameExtensionFilter filtropython = new FileNameExtensionFilter(«Archivos Python», «py»);
    FileNameExtensionFilter filtrovrml = new FileNameExtensionFilter(«Archivos VRML», «wrl»);

    selector.setFileFilter(filtrotxt);
    selector.setFileFilter(filtrojava);
    selector.setFileFilter(filtrocpp);
    selector.setFileFilter(filtroWord);
    selector.setFileFilter(filtroWord);
    selector.setFileFilter(filtroPowerPoint);
    selector.setFileFilter(filtroExcel);
    selector.setFileFilter(filtroImagen);
    selector.setFileFilter(filtroPDF);
    selector.setFileFilter(filtropython);
    selector.setFileFilter(filtrovrml);

    int resultado=selector.showSaveDialog(selector);

    if(resultado == JFileChooser.APPROVE_OPTION){
    File archivo = selector.getSelectedFile();
    try{
    FileWriter guardar = new FileWriter(archivo);
    guardar.write(txt_texto.getText());
    JOptionPane.showMessageDialog(null, «¡Archivo guardado!»);
    }
    catch(Exception e){
    JOptionPane.showMessageDialog(null, «Error al guardar el archivo.»);
    e.printStackTrace();
    }
    }

  2. Alexandre Martínez Correia

    Como puedo hacer que cuando el usuario ponga un nombre a la hora de guardar el fichero me pongo la extensión dependiendo el filtro que elije.

  3. Brayan de Jesus

    Me funciono la verdad muchas gracias

Deja una respuesta

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


Warning: Trying to access array offset on value of type null in /home2/discodur/public_html/discoduroderoer/wp-content/themes/disto/single.php on line 539