Cargando un archivo en nuestro editor.

Hasta ahora nuestro editor de textos era lo más tonto que existía, solo tenia un entorno y lo único que se podía hacer con el era cerrarlo, vamos a mejorar un poco esto y vamos a hacer que cargue fichero, para eso en la linea que habíamos creado como menú "cargar" vamos a modificarlo y le vamos a pedir que nos cree una acción.

JMenuItem cargar = new JMenuItem(new OpenFileAction(areaTexto));

como se puede comprobar con esto estamos pasandole en lugar de un String, con lo que queremos que ponga dentro, le pasamos una acción nueva con lo que queremos que se ejecute cuando le hagamos click. A la acción ademas le tenemos que indicar que parte de nuestro frame sera el afectado, de manera que como queremos que aquello que se cargue nos lo refleje en el área de edición pues le pasamos "areaTexto" que es el que le hace referencia.

En el caso de las acciones tenemos que hacer algo especial, por las costumbres que tenemos a la hora de programar en objetos que es que cuando se hacen acciones solemos dividir las que son, digamos... habituales que serán las "BaseAction" y luego tenemos las acciones especificas de lo que queremos realizar y en algunos casos extender alguna acción contenida en la "BaseAction". Nuestro "BaseAction" quedaría de la siguiente manera.

/*
 * Fichero: BaseAction.java
 * Autor: Liem Dazkun
 * Fecha: 17/10/11
 */
package LFR.Liem.Dazkun.Test.Java.Editor.Actions;

import java.awt.event.ActionEvent;

import java.io.File;
import java.io.FileNotFoundException;

import javax.swing.AbstractAction;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.text.JTextComponent;


/**
 * Clase padre de las acciones de salvar fichero y cargar fichero con el código común
 * para ambas acciones.
.
 *
 * @author Chuidiang
 *
  */
public abstract class BaseAction extends AbstractAction
{
    /** 
     * Componente con el texto que se quiere salvar o en el que se quiere mostrar el
     * contenido del fichero.
     */
    protected JTextComponent componenteTexto;

    /** 
     * Panel que permite elegir un fichero del disco y navegar.  
     */
    private JFileChooser fileChooser = null;

    /** 
     * Si la acción va a ser para salvar o para cargar. 
     */
    private Opciones opcion;

    /** Enumerado con las posibles opciones para la acción */
    public enum Opciones
    {
     SALVAR, CARGAR;
    }

    /**
     * Crea un nuevo objeto AbstractAccionFichero.
     *
     * @param componenteTexto Componente de texto sobre el que actuar, salvando su
     * contenido o mostrando en él el contenido de un fichero.
     * @param opcion SALVAR o CARGAR.
     */
    public BaseAction(JTextComponent componenteTexto, Opciones opcion){
        this.componenteTexto = componenteTexto;
        this.opcion = opcion;
    }

    /**
     * Se ha pulsado el botón y se muestra el File Chooser.
     *
     * @param arg0 Evento de pulsación del botón.
     */
    public void actionPerformed(ActionEvent arg0)
    {
     // Se crea el FileChooser si no estaba creado.
        if (fileChooser == null)
        {
            fileChooser = new JFileChooser();
        }

        int opcionSeleccionada;

        // Se muestra el FileChooser como dialogo de salvar o de cargar según la opción
        // SALVAR o CARGAR que se haya pasado en el constructor.
        if (opcion == Opciones.SALVAR)
        {
            opcionSeleccionada = fileChooser.showSaveDialog(componenteTexto);
        }
        else
        {
            opcionSeleccionada = fileChooser.showOpenDialog(componenteTexto);
        }

        // Si el usuario elige un fichero y pulsa "OK"...
        if (JFileChooser.APPROVE_OPTION == opcionSeleccionada)
        {
         // Se obtiene el fichero
            File fichero = fileChooser.getSelectedFile();

            try
            {
             // Se salva o carga. Las clases hijas deben redefinir este método.
                actuarSobreElFichero(fichero);
            }
            catch (Exception e)
            {
             // Mensaje de error si se produce.
                JOptionPane.showMessageDialog(
                    componenteTexto, e, "Error en el fichero " + fichero,
                    JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Las clases hijas deben salvar el contenido del area de texto en el fichero que se
     * pasa como parámetro o leer el fichero y meter su contenido en el area de texto.
     *
     * @param fichero Fichero que se debe leer o en el que se debe grabar.
     *
     * @throws FileNotFoundException Excepción si el fichero no existe.
     */
    protected abstract void actuarSobreElFichero(File fichero)
        throws FileNotFoundException;
}



La acción para cargar el fichero quedaría de la siguiente manera.


/*
 * Fichero: OpenFileAction.java
 * Autor: Liem Dazkun
 * Fecha: 17/10/11
 */
package LFR.Liem.Dazkun.Test.Java.Editor.Actions;

import java.awt.Event;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.text.JTextComponent;


/**
 * @author Liem Dazkun
 *
  */
public class OpenFileAction extends BaseAction
{
    /**
     * serial uid
     */
    private static final long serialVersionUID = 2L;

    /**
     * Crea un nuevo objeto OpenFileAction.
     *
     * @param componenteTexto Componente en el que mostrar el texto leido.
     */
    public OpenFileAction(JTextComponent componenteTexto){
     // Configurar clase padre para que sea CARGAR fichero.
        super(componenteTexto, Opciones.CARGAR);
        
        // Etiqueta y tecla aceleradora
        this.putValue(Action.NAME, "Abrir ...");
        this.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('O', Event.CTRL_MASK));
    }

    /**
     * Le el fichero que se le pasa y pone el contenido en el JTextArea.
     *
     * @param fichero Fichero a leer
     *
     * @throws FileNotFoundException No se puede abrir el fichero.
     */
    @Override
    protected void actuarSobreElFichero(File fichero)throws FileNotFoundException{
     // Se prepara el reader para leer el fichero. Un StringBuffer para compener el
     // texto total de forma eficiente, que diría rfilgueiras.
        BufferedReader reader = new BufferedReader(new FileReader(fichero));
        StringBuffer bufferTexto = new StringBuffer();

        try
        {
            String linea = reader.readLine();

            while (linea != null)
            {
             // Se va añadiendo las líneas que se leen y un separador de línea
             // adecuado para el sistema operativo. Este último puede ser /n o /r/n
             // dependiendo de si es unix o windows. System.getProperty("line.separator")
             // nos da el adecuado.
                bufferTexto.append(linea);
                bufferTexto.append(System.getProperty("line.separator"));
                
                // Siguiente linea.
                linea = reader.readLine();
            }
        }
        catch (IOException e)
        {
            JOptionPane.showMessageDialog(
                componenteTexto, e, "Error al leer fichero",
                JOptionPane.ERROR_MESSAGE);
        }

        // Se pone el texto leido en el JTextArea.
        componenteTexto.setText(bufferTexto.toString());
    }
}



Con estas dos acciones escritas podríamos ejecutar la carga de un fichero, de momento no se podría realizar nada más, pero esto seria un claro ejemplo de lo que podemos hacer con este fichero.