El patrón que estoy tratando de implementar en mi proyecto es el de Modelo-Vista-Controlador.
A modo de ejemplo tomaré la función abrir. A continuación se puede apreciar como es que divide el código para manejar el patrón MVC.
/** Clase que maneja la vista del editor
*
*
*
*
* */
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.text.*;
public class Interfaz extends JFrame{
JMenuBar barraMenu;
JMenu archivo;
JMenuItem abrirFichero;
JMenuItem guardarFichero;
JMenuItem salir;
JMenu edicion;
JMenuItem cortar;
JMenuItem copiar;
JMenuItem pegar;
JTextArea areaDeTexto;
JScrollPane desplazamiento;
// Constructor de la clase Interfaz.
public Interfaz(){
super("Editor ++");
this.setSize(400,400);
this.definir_componentes();
this.agregar_componentes();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/** Se definen los componentes de la ventana, así como también
* algunas de sus características
*
*
* */
public void definir_componentes(){
// Área de Texto
areaDeTexto = new JTextArea();
areaDeTexto.setLineWrap(true);
areaDeTexto.setWrapStyleWord(true);
desplazamiento = new JScrollPane(areaDeTexto);
// Barra de menú y menús
barraMenu = new JMenuBar();
archivo = new JMenu("Archivo");
archivo.setMnemonic(KeyEvent.VK_A);
edicion = new JMenu("Edición");
edicion.setMnemonic(KeyEvent.VK_E);
// MenuItems
abrirFichero = new JMenuItem(new ModeloAbrir(areaDeTexto));
guardarFichero = new JMenuItem(new ModeloGuardar(areaDeTexto));
salir = new JMenuItem("Salir");
Action accionCopiar = areaDeTexto.getActionMap().get(DefaultEditorKit.copyAction);
accionCopiar.putValue(Action.NAME,"Copiar ");
accionCopiar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('C',Event.CTRL_MASK));
copiar = new JMenuItem(accionCopiar);
Action accionPegar = areaDeTexto.getActionMap().get(DefaultEditorKit.pasteAction);
accionPegar.putValue(Action.NAME,"Pegar ");
accionPegar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('P',Event.CTRL_MASK));
pegar = new JMenuItem(accionPegar);
Action accionCortar = areaDeTexto.getActionMap().get(DefaultEditorKit.cutAction);
accionCortar.putValue(Action.NAME,"Cortar ");
accionCortar.putValue(Action.ACCELERATOR_KEY,KeyStroke.getAWTKeyStroke('O',Event.CTRL_MASK));
cortar = new JMenuItem(accionCortar);
}
/** Agrega los componentes definidos por
* la función definir_componentes()
*
* */
public void agregar_componentes(){
barraMenu.add(archivo);
barraMenu.add(edicion);
archivo.add(abrirFichero);
archivo.add(guardarFichero);
archivo.add(salir);
edicion.add(copiar);
edicion.add(pegar);
edicion.add(cortar);
this.add(barraMenu, BorderLayout.NORTH);
this.add(desplazamiento, BorderLayout.CENTER);
}
}Clase ModeloAbrir
/** Clase en la que se maneja la mayor parte de la lógica de la
* acción abrir del menú Archivo
*
*
* */
import java.awt.Event;
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;
// Clase ModeloAbrir que hereda de la clase abstracta ControladorAbrir
public class ModeloAbrir extends ControladorAbrir {
/** Constructor de la clase ModeloAbrir
*
*
* @param areaDeTrabajo Componente en el que se pretende mostrar el
* contenido del archivo leído.
*/
public ModeloAbrir(JTextComponent areaDeTrabajo)
{
// Se le pasa al constructor de la superclase el JTextComponent
super(areaDeTrabajo);
// Etiqueta y tecla aceleradora
this.putValue(Action.NAME, "Abrir ...");
this.putValue(Action.ACCELERATOR_KEY,
KeyStroke.getAWTKeyStroke('A', Event.CTRL_MASK));
}
/**
* Lee el archivo y coloca su contenido en el área de texto
*
* @param archivo Archivo a leer
*
* @throws FileNotFoundException Error al leer el archivo
*/
@Override
protected void logicaAbrir(File archivo)
throws FileNotFoundException
{
// Se crea el objeto archivoEntrada para leer el archivo.
// bufferLinea irá modificando su longitud al ir leyendo las lineas del
// archivo. Al final todos esos caracteres se colocarán en el area de Texto
BufferedReader archivoEntrada = new BufferedReader(new FileReader(archivo));
StringBuffer bufferLinea = new StringBuffer();
try
{
String linea = archivoEntrada.readLine();
while (linea != null)
{
// Se va añadiendo las líneas que se leen a la variable bufferLinea
// modificando cada vez la longitud de caracteres de esta variable.
// Además se agrega un salto de línea con la instrucción
// System.getProperty("line.separator") la cual da mayor portabilidad
bufferLinea.append(linea);
bufferLinea.append(System.getProperty("line.separator"));
// Siguiente linea.
linea = archivoEntrada.readLine();
}
}
catch (IOException e)
{
JOptionPane.showMessageDialog(
areaDeTrabajo, e, "Error al leer el archivo",
JOptionPane.ERROR_MESSAGE);
}
// Se pone el texto leido en el JTextArea.
areaDeTrabajo.setText(bufferLinea.toString());
}
}
Clase ControladorAbrir
/** Clase que maneja el controlador de la acción abrir del menú
* Archivo
*
*
* */
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public abstract class ControladorAbrir extends AbstractAction{
protected JTextComponent areaDeTrabajo;
private JFileChooser fc;
/** Constructor de la clase ControladorAbrir.
*
*
* @param areaDeTrabajo Componente de texto en el cual se mostrará
* el contenido del archivo
*
*/
public ControladorAbrir(JTextComponent areaDeTrabajo)
{
this.areaDeTrabajo = areaDeTrabajo;
}
/** Método que se dispara cuando se da clic en la opción Abrir
*
* @param event
*/
public void actionPerformed(ActionEvent event)
{
// Se crea el FileChooser.
fc = new JFileChooser();
int respuesta;
respuesta = fc.showOpenDialog(areaDeTrabajo);
// Confirma que se haya presionado el botón Abrir y así poder aplicar
// la lógica de la opción Abrir
if (JFileChooser.APPROVE_OPTION == respuesta)
{
// Se obtiene el fichero
File archivo = fc.getSelectedFile();
try
{
// Se abre el archivo. Este método tiene que ser definido por las
// clases hijas
logicaAbrir(archivo);
}
catch (Exception e)
{
// Mensaje de error si se produce.
JOptionPane.showMessageDialog(
areaDeTrabajo, e, "Error en el archivo " + archivo,
JOptionPane.ERROR_MESSAGE);
}
}
}
/** Las clases hijas deben redefinir este método abstracto para leer el contenido
* del archivo
*
* @param archivo Archivo del cual se va a leer
*
* @throws FileNotFoundException Excepción si el archivo no existe.
*/
protected abstract void logicaAbrir(File archivo)
throws FileNotFoundException;
}
Enseguida también pongo el código como separé la funcionalidad "Guardar como...".
La parte de Interfaz es la misma que la mostrada en el ejemplo anterior.
Clase ModeloGuardar
/** Clase en la que se maneja la mayor parte de la lógica de la
* acción guardar del menú Archivo
*
*
*
*
* */
import java.awt.Event;
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;
//Clase ModeloGuardar que hereda de la clase abstracta ControladorGuardar
public class ModeloGuardar extends ControladorGuardar
{
/** Constructor de la clase ModeloGuardar
*
*
* @param areaDeTrabajo Componente en el que se pretende tomar el contenido
* para guardarlo en alguna ruta en específico
*/
public ModeloGuardar(JTextComponent areaDeTrabajo)
{
// Se le pasa al constructor de la superclase el JTextComponent
super(areaDeTrabajo);
// Etiqueta y tecla aceleradora
this.putValue(Action.NAME, "Guardar como... ");
this.putValue( Action.ACCELERATOR_KEY,
KeyStroke.getAWTKeyStroke('G', Event.CTRL_MASK));
}
/** Toma el archivo creado de la ruta específicada en el selector de archivos
* y escribe sobre él el contenido del areaDeTrabajo (área de Texto) para
* guardarlo en dicho archivo
*
* @param archivo Archivo a escribir
*
* @throws FileNotFoundException Error al leer el archivo
*/
protected void logicaGuardar(File archivo) throws FileNotFoundException
{
PrintWriter archivoSalida = new PrintWriter(archivo);
archivoSalida.print(areaDeTrabajo.getText());
archivoSalida.close();
}
}
Clase ControladorGuardar
/** Clase que maneja el controlador de la acción guardar del menú
* Archivo
*
*
* */
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public abstract class ControladorGuardar extends AbstractAction
{
protected JTextComponent areaDeTrabajo;
private JFileChooser selectorArchivos;
/** Constructor de la clase ControladorGuardar
*
*
* @param componenteTexto Componente de texto del cual se dispondrá de
* su contenido para guardarlo
*
*/
public ControladorGuardar( JTextComponent areaDeTrabajo)
{
this.areaDeTrabajo = areaDeTrabajo;
}
/** Método que se dispara cuando se da clic en la opción Guardar
*
* @param event
*/
public void actionPerformed(ActionEvent event)
{
selectorArchivos = new JFileChooser();
int respuesta;
respuesta = selectorArchivos.showSaveDialog(areaDeTrabajo);
// Confirma que se haya presionado el botón Guardar y así poder aplicar
// la lógica de la opción Guardar
if (JFileChooser.APPROVE_OPTION == respuesta)
{
// Se obtiene el fichero
File archivo = selectorArchivos.getSelectedFile();
try
{
// Se guarda. Las clases hijas deben redefinir este método.
logicaGuardar(archivo);
}
catch (Exception e)
{
// Mensaje de error si se produce.
JOptionPane.showMessageDialog(null,"Error de archivo"+e.toString());
}
}
}
/** Las clases hijas deben redefinir este método abstracto para guardar el contenido
*
*
* @param archivo Archivo en el cual se va a guardar
*
* @throws FileNotFoundException Excepción si el archivo no existe.
*/
protected abstract void logicaGuardar(File archivo)throws FileNotFoundException;
}Fuentes
Chuidiang
No hay comentarios:
Publicar un comentario