JMenuItem cargar = new JMenuItem(new OpenFileAction(areaTexto));
/* * 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.