Programacin II
Curso 06/07
Laboratorio 6
LABORATORIO 6. PATRN MVC
Mayo, 2007
Descripcin del patrn Modelo-Vista-Controlador
MVC es un patrn de arquitectura de software que separa los datos de una aplicacin (Modelo), la interfaz de usuario (Vista), y la lgica de control (Controlador) en tres componentes distintos. A continuacin se describe brevemente el funcionamiento y cmo se ha aplicado el patrn de diseo en la interfaz grfica proporcionada. El patrn MVC se basa fundamentalmente en el uso del patrn Observador (ya utilizado en el Laboratorio 4). A continuacin se describen los distintos componentes: Vista: Ventanas de la interfaz grfica Implementan el patrn Observador. Vigilan el modelo (o la parte del modelo correspondiente) para reaccionar ante los cambios en su estado y mostrar la informacin de manera adecuada. Modelo: Clases desarrolladas en los laboratorios anteriores. Implementan el patrn Observable. Definen la lgica del juego. Informan a la Vista cuando se produce algn cambio en el estado. Controlador Responde a eventos que se producen en la Vista invocando los mtodos de las clases del modelo correspondientes. La siguiente figura (diagrama de secuencia UML) ilustra el funcionamiento del patrn MVC en una ventana concreta del Buscaminas (VentanaTablero). En un primer paso la ventana se registra como Observadora del Tablero (Observable). Cuando el usuario realiza una operacin en la ventana (click izquierdo en una casilla) la ventana comunica el evento al Controlador para que lo gestione. El Controlador invoca el mtodo clickIzquierdo del Tablero. El Tablero, abre la casilla correspondiente y avisa a la ventana para que actualice la informacin mostrada.
Programacin II
Curso 06/07
Laboratorio 6
A continuacin se describe cmo se ha desarrollado una ventana aplicando el patrn MVC. Para este ejemplo se ha seleccionado una clase sencilla: VentanaInicial.
La ventana debe aplicar el patrn Observer
public class VentanaInicial extends JDialog implements Observer Ventana Observer
Se implementa el mtodo update que se ejecuta cuando cambia el estado de la Sesion (Observable)
public void update(Observable arg0, Object arg1) { if (sesion.obtNombreUsuario() != null) { textNombre.setText(sesion.obtNombreUsuario()); } else { textNombre.setText(""); } textNivel.setText("" +sesion.obtNivel()); }
Programacin II
Curso 06/07
Laboratorio 6
El constructor de la ventana registra la ventana (Observer) en la Sesion (Observable)
public VentanaInicial(Frame frame, String title, boolean modal) { super(frame, title, modal); // Registrar la ventana como observador de la Sesion sesion.addObserver(this); // Colocar los componentes, redimensionar la ventana y colocarla centrada try { jbInit(); pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height frameSize.height) / 2); } catch(Exception ex) {} // Actualizar la informacin de la pantalla update(sesion,null); }
Definir el controlador El controlador, generalmente, es una clase privada interna definida dentro de la Ventana. Se encarga de capturar los eventos en la interfaz grfica y de gestionarlos de manera adecuada. El controlador debe implementar las interfaces necesarias para la gestin de los posibles eventos de la interfaz grfica (ActionListener. MouseListener,...).
public class VentanaInicial extends JDialog implements Observer{ // Atributos y mtodos de la clase private Controlador controlador = new Controlador(); private class Controlador implements ActionListener { public void actionPerformed(ActionEvent arg0) { String s = textNombre.getText(); if (s.length() == 0) s="desconocido"; sesion.ponNombreUsuario(s); s = textNivel.getText(); if (s.length() == 0) s="1"; sesion.ponNivel(Integer.parseInt(s.trim())); setVisible(false); } } }
Registrar el controlador para que gestione los eventos de la interfaz grfica
Programacin II
Curso 06/07
Laboratorio 6
void jbInit() throws Exception { botonOk.setBorder(border4); botonOk.setText("OK"); botonOk.addActionListener(controlador); botonOk.setActionCommand("OK"); panelOk.add(botonOk, null); }
Si hay varios controles, se utiliza el actionCommand (una clave para identificar el objeto sobre el que se ha producido el evento) asignado para determinar qu operaciones realizar.
public class VentanaSiNo extends JDialog { void jbinit() throws Exception { botonNo.setActionCommand("botonNo"); botonNo.addActionListener(controlador); botonSi.setText("Si"); botonSi.setActionCommand("botonSi"); botonSi.addActionListener(controlador); } private class Controlador implements ActionListener { public void actionPerformed(ActionEvent pEvent) { if (pEvent.getActionCommand().equalsIgnoreCase("botonNo")) { respuesta = false; setVisible(false); } else { respuesta = true; setVisible(false); } } } }