Professional Documents
Culture Documents
La UI de una aplicacin est sujeta a muchos cambios: Cambio de UI para diferentes usuarios Los cambios en la UI deben ser fciles an en runtime Diferentes look and feel no deben afectar el ncleo funcional La misma informacin puede mostrarse en ventanas diferentes Los cambios en los datos subyacentes, deben reflejarse inmediatamente en todas las vistas Conviene separar: procesamiento, entradas y salidas
Model-View-Controller (MVC)
MVC divide una aplicacin UI en: Modelo: Contiene el ncleo funcional y datos Vista: Muestra informacin al usuario Controlador: Maneja las entradas del usuario
Vistas+Controladores = UI Mecanismo de Change-Propagation : nico link entre Modelo e UI.
Output
View
Model Input
Controller
UI
M
C
M
C
M
C
M
C
M
C
redibujado
Patrn Observer
MVC es un patrn que puede ser expresado como una combinacin de otros patrones. La interaccin Modelo-Vista es generalmente descripta usando el patrn Observer: Define una dependencia uno a muchos entre objetos, de forma tal que cuando uno de ellos (sujeto Observable) cambia su estado, todos los que dependen de ste (Observers) son notificados y actualizados automticamente.
Patrn Observer
Observers
Un sujeto puede tener cualquier cantidad de observadores dependientes. Todos los observadores son notificados cuando el sujeto experimenta un cambio en su estado. En respuesta a ello cada observador interroga al sujeto para sincronizar su estado con el de ste.
Java: Observer/Observable
java.util.Observable (Subject): Cualquier clase que desee ser observada debe extender esta clase mtodos para add/delete Observers mtodos para notify todos los Observers de un cambio (para indicar que hubo un cambio:setchanged) Use Vector para almacenar las referencias a los Observers java.util.Observer (interface) debe ser implementada por cualquier clase que quiera actuar como Observer. update() en respuesta a notifyObserver() Modelo de delegacin de eventos: la fuente de eventos es Observable y los listeners de eventos son Observers.
Ejemplo
// Un sujeto a observar ! public class ConcreteSubject extends Observable { private String name; private float price; public ConcreteSubject(String n, float p) { name = n; price = p; System.out.println("ConcreteSubject creado: " + name +"a "+ price);}
public setPrice(float p){price=p;//idem para setName setChanged();//flag para indicar el cambio en Observable
Ejemplo
// An observer of price changes. (Idem para observar nombre)
public class PriceObserver implements Observer { private float price;
Ejemplo
//Test
public class TestObservers { public static void main(String args[]) {
Ejemplo
Salida del programa Test ConcreteSubject creado: Corn Pops a 1.29 PriceObserver creado: Precio es 0.0 PriceObserver: Precio cambia a 4.57
MVC y Swing
Swing usa una arquitectura similar a MVC, llamada Model-Delegate, muy difcil crear un controlador genrico que no conozca los datos especfico de una vista. Colapsan Vista y Controlador (UI) en un nico objeto (UI delegate, puesto que la UI se delega a este objeto). Se pueden usar mltiples vistas de un mismo modelo. Componentes pueden compartir un mismo modelo. (JScrollBar, JSlider, ProgressBar comparten el BoundedRangeModel), permitiendo la conectividad automtica entre componentes.
MVC y Swing
View
Model
Controller Component
UI-delegate
MVC y Swing
MVC y Swing
Modelos en Swing
En Swing muchos de los modelos son interfaces Ej.: ButtonModel, ListModel, TableModel Usualmente existe un modelo por defecto que se asocia automticamente con un componente DefaultButtonModel implementa ButtonModel Muchas aplicaciones no necesitan preocuparse por ellos
Modelos en Swing
Casi todos los componentes proveen el API del modelo directamente. El componente puede ser manipulado sin interactuar con el modelo para nada.
//Ejemplo de la clase JSlider
public int getValue() { return getModel().getValue(); } //Podemos usar lo siguiente y evitar el modelo JSlider slider = new JSlider(); int value = slider.getValue();
PLAF
PLAF
Para cambiar el L&F al de la plataforma nativa del usuario: try { UIManager.setLookAndFeel ( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (java.lang.ClassNotFoundException e) { // No puede cambiar el L&F } Para cambiar a Metal L&F (Java-native L&F) try { UIManager.setLookAndFeel ( "javax.swing.plaf.metal.MetalLookAndFeel"); } catch (java.lang.ClassNotFoundException e) { // Si no puede cambiar el L&F}