Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
proceso catico. La dinmica del interfaz (Listeners de los eventos de ratn/teclado), estn tienen que tener acceso a las variables de estado y a los componentes para pintar los resultados. La estructuracin del cdigo no es fcil. Si la aplicacin es grande, es un claro problema de mantenimiento del cdigo a medio plazo.
RecuadrosMain
relacionados. Manipulan los mismos datos La modificacin de los datos se muestra como resultado en otro componente.
private void jTextLargoActionPerformed (java.awt.event.ActionEvent evt) { // TODO add your handling code here:
private void jSlideLargoStateChanged (java.awt.event.ActionEvent evt) { // TODO add your handling code here:
Rediseo
Separar los datos y el cdigo del interfaz
Generar una clase para el rectngulo (datos y operaciones)
GUI
Modelo de Datos
Clase ModeloRecuadro
public class ModeloRecuadro { private double alto; private double largo; public ModeloRecuadro(double a, double l) { alto=a; largo=l; } public void fijarAlto(double a) { alto=a; } public void fijarLargo(double l) { largo=l; } public double obtenerAlto() { return alto; } public double obtenerLargo() { return largo; } public double calcularArea() { return alto * largo; } public double calcularPerimetro() { return 2*alto+2*largo; } }
problemas:
Pueden existir varios componentes de interfaz de modifiquen o
muestren datos del modelo. La lgica de cundo se modifica el modelo de datos (no de cmo se hace) sigue residiendo en el interfaz, junto con la declaracin de los componentes grficos. El interfaz grfico se tiene que encargar de cuando se hace una modificacin recalcular el efecto sobre todos los componentes del mismo que se ven afectados.
ModeloVistaControlador (MVC)
GUI
Modificar Datos
Controlador
El Controlador es el encargado de procesar los mandatos del
consultar sus valores. El Controlador modifica los datos del Modelo. El Modelo actualiza cmo se muestran de los datos del Modelo en la Vista.
Clase ControladorRecuadros
public class ControladorRecuadros implements ActionListener, FocusListener, ChangeListener { public void actionPerformed(ActionEvent ae) {} public void focusGained(FocusEvent fe) {} public void focusLost(FocusEvent fe) {} public void stateChanged(ChangeEvent ce) {} }
Event. Si se hace as no es necesario que conozca la clase de la Vista (no siempre puede ser as). Dependiendo de la fuente se puede determinar qu componente se ha accionado (usado getName(), por ejemplo)
El Controlador debe acceder al Modelo para modificar los
datos.
Vista
La Vista debe tener un mecanismo para actualizar todos los
componentes del interfaz. La actualizacin del interfaz se invocar desde el Modelo. (El modelo sabe cundo ha habido cambios) La implementacin de la actualizacin la hace la Vista (Sabe qu necesita para actualizar el interfaz)
mismo Modelo. La ms interesante, incluso, es que el Modelo no tenga que ser consciente de cuntas y cules son las Vistas que deben ser actualizadas cuando se modifica el Modelo. El Controlador o la clase principal pueden ser los encargados en asociar Vistas y Modelos. De qu forma se puede disear eso?
Patrones de Diseo
El diseo de aplicaciones orientadas a objetos es un proceso
complejo. Existen muchos tipos de interacciones que se repiten en diseos de aplicaciones diferentes. Los patrones de diseo son modelos (abstractos) de este tipo de interacciones. Un patrn de diseo define:
Una serie de clases que participan. El rol de estas clases y su semntica.
que cuando uno de ellos (sujeto Observable) cambia su estado, todos los que dependen de ste (Observadores) son notificados y actualizados automticamente.
interface Observer * update() Observable 1 addObserver() setChanged() notifyObserver()
VistaXXX * update() 1
ModeloXXX
(Modelo): Cualquier clase que desee ser observada debe extender esta clase:
mtodos para addObserver()y deleteObserver()
mtodos para notifyObservers() todos los Observadores de
a los Observadores
java.util.Observer
(interfaz Vista) debe ser implementada por cualquier clase que quiera actuar como Observador.
Se implementa update() para actualizar el Observador.
Dinmica MVC
El usuario acta sobre un elemento del interfaz que tiene asociado un determinado Controlador (Listener) El Controlador puede obtener de la Vista datos de los componentes del interfaz.
Usuario
GUI
getText() getValue()
Dinmica MVC
El Controlador solicita al Modelo la modificacin de determinados valores. El Modelo modifica su estado y se invoca al mtodo setChanged()
GUI
Dinmica MVC
El Modelo invoca a su mtodo notifyObservers() el cual recorre la lista de observadores y llama a sus mtodos update()
GUI
update()
Dinmica MVC
Cada Vista consulta el Modelo para obtener los datos actualizados que tienen que mostrar en la implementacin de update()
GUI
Ejercicio (1)
Partimos del proyecto RecuadrosMain 1. Dividimos el interfaz en dos jPanel (cada uno de ellos ser una Vista). Desde la propia herramienta de diseo. 2. Crearemos una clase para el Modelo. 3. Crearemos una clase para el Controlador (derivando todos los Listener necesarios). 4. El Modelo y las Vistas implementar en patrn de diseo Observador Observable 5. Crear y establecer las relaciones entre Modelo, Vistas y Controlador.
Ejercicio (2 extra)
cuadrados. Separar el Controlador en dos/tres Controladores diferentes. Incluir nueva informacin en el Modelo (e.g., Profundidad) y crear una nueva Vista que lo muestre/maneje.