Está en la página 1de 3

Arquitectura modelo-vista-controlador

• En MVC un elemento tiene tres partes:


• un modelo que gestiona los datos
• una vista que gestiona como se muestran esos datos
• un controlador que determina que modificaciones hay que hacer cuando se
interacciona con el elemento.
Interfaces gráficas de usuario (GUI) • Ventajas de MVC.
• Es posible tener diferentes vistas para un mismo modelo (eg.
representación de un conjunto de datos como una tabla o como un
Modelo-Vista-Controlador diagrama de barras).
Modelo-Delegado • Es posible construir nuevas vistas sin necesidad de modificar el modelo
subyacente.
• Proporciona un mecanismo de configuración a componentes complejos
muchos más tratable que el puramente basado en eventos (el modelo puede
verse como una representación estructurada del estado de la interacción).

Java 1 Java 2

Relaciones en MVC Swing: Modelo-Delegado


• En Swing se utiliza una adaptación de esta arquitectura de modo que la
vista y el controlador se agrupan en el componente (Delegado) pero el
modelo se mantiene separado permitiendo comportamientos muy
sofisticados.
Vista
Modelo • Por ejemplo, como los modelos gestionan y almacenan los datos existe la
Modelo m
(datos)
Control c posibilidad de compartir un mismo modelo entre varios componentes. Cada
uno de los componentes puede modificar el modelo y dicha modificación
se reflejará de forma automática en el resto de los componentes que
comparten dicho modelo.
• Estos modelos de datos son especialmente importantes en los componentes
que trabajan con texto y en las listas.
Controlador • El modelo se consulta y actualiza con métodos get<Model> /
Modelo m set<Model> (donde <Model> depende del tipo de componte). El
Vista v Interfaces delegado se consulta/actualiza con los métodos getUI / setUI.
claros

Java 3 Java 4
Swing: Modelo-Delegado Ejemplo de modelo compartido
public class ModeloCompartido {
JTextArea areaTexto1, areaTexto2;
JFrame ventana;
Document documento;
public ModeloCompartido(String titulo){
Componente ventana = new JFrame(titulo);
Swing Vista Container panelContenido = ventana.getContentPane();
areaTexto1= new JTextArea(10,100);
documento=areaTexto1.getDocument();
Modelo areaTexto2= new JTextArea(documento);
areaTexto2.setColumns(100);
areaTexto2.setRows(10);
panelContenido.setLayout(new BoxLayout(panelContenido, BoxLayout.Y_AXIS));
panelContenido.add(new JScrollPane(areaTexto1));
Controlador panelContenido.add(Box.createGlue());
delegado panelContenido.add(new JScrollPane(areaTexto2));
panelContenido.add(Box.createGlue());
ventana.setSize(500, 300); ventana.setVisible(true);
}
public static void main(String args[]) {
ModeloCompartido aplicacion = new ModeloCompartido("Prueba documento compartido"); }
}//ModeloDocumentoCompartido
Java 5 Java 6

Resultado Modelo de datos en componentes de texto


• JTextComponent es el componente base de todos los que
se utilizan como vistas textuales y proporciona el
comportamiento básico de todos ellos.
• Propiedades de JTextComponent
• Document es la propiedad que contiene el modelo de datos
para todos los componentes de texto
• Text es la propiedad que permite utilizar el modelo de datos de
los componentes de texto como un String

Java 7 Java 8
Modelos de datos de las listas Ejemplo del tutorial de Swing de Sun
• interface ListModel listModel = new DefaultListModel();
listModel.addElement("Alison Huml");
❏ void addListDataListener(ListDataListener l) listModel.addElement("Kathy Walrath");
Adds a listener to the list that's notified each time a change to the listModel.addElement("Lisa Friendly");
data model occurs. listModel.addElement("Mary Campione");
❏ Object getElementAt(int index)
list = new JList(listModel);
Returns the value at the specified index.
❏ int getSize() public void actionPerformed(ActionEvent e) {
Returns the length of the list. int index = list.getSelectedIndex();
❏ void removeListDataListener(ListDataListener l) listModel.remove(index);
Removes a listener from the list that's notified each time a change int size = listModel.getSize();
to the data model occurs. //Nobody's left, disable firing
if (size == 0) {
• class DefaultListModel fireButton.setEnabled(false); //Adjust the selection }
Oyente de acciones
registrado en el
• Modelo de datos de las listas que se comporta como un Vector else {
botón Fire
//removed item in last position
• Implementa el interface ListModel if (index == listModel.getSize())
index--; //otherwise select same index
list.setSelectedIndex(index); } }
Java 9 Java 10

Ejemplo continuación
public void actionPerformed(ActionEvent e) {
//User didn't type in a name...
if (employeeName.getText().equals("")) { Oyente de acciones
Toolkit.getDefaultToolkit().beep(); registrado en el
return; botón Hire
}
int index = list.getSelectedIndex();
int size = listModel.getSize();
//If no selection or if item in last position is selected,
//add the new hire to end of list, and select new hire
if (index == -1 || (index+1 == size)) {
listModel.addElement(employeeName.getText());
list.setSelectedIndex(size);
//Otherwise insert the new hire after the current selection, and select new hire
}
else {
listModel.insertElementAt(employeeName.getText(), index+1);
list.setSelectedIndex(index+1);
}}
Java 11

También podría gustarte