<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1683-0789</journal-id>
<journal-title><![CDATA[Acta Nova]]></journal-title>
<abbrev-journal-title><![CDATA[RevActaNova.]]></abbrev-journal-title>
<issn>1683-0789</issn>
<publisher>
<publisher-name><![CDATA[Universidad Católica Boliviana]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1683-07892004000100005</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[El patrón de diseño Modelo-Vista-Controlador (MVC) y su implementación en Java Swing]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Bascón Pantoja]]></surname>
<given-names><![CDATA[Ernesto]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Jalasoft  ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2004</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2004</year>
</pub-date>
<volume>2</volume>
<numero>4</numero>
<fpage>493</fpage>
<lpage>507</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.bo/scielo.php?script=sci_arttext&amp;pid=S1683-07892004000100005&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.bo/scielo.php?script=sci_abstract&amp;pid=S1683-07892004000100005&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.bo/scielo.php?script=sci_pdf&amp;pid=S1683-07892004000100005&amp;lng=en&amp;nrm=iso"></self-uri></article-meta>
</front><body><![CDATA[ <p align="right"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>Apunte</b></font></p>     <p align="right">&nbsp;</p>     <p align="center"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="4">El patrón de diseño</font> <font face="Verdana, Arial, Helvetica, sans-serif" size="4">Modelo-Vista-Controlador (MVC) y su implementación en Java Swing</font></b></p>     <p align="center">&nbsp;</p>     <p align="center">&nbsp;</p>     <p align="center"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Ernesto Bascón Pantoja</font><font face="Verdana, Arial, Helvetica, sans-serif" size="2"></font></b></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Desarrollador de software</font>    <br> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">Jalasoft </font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>e-mail: </b><a href="mailto:ebascon@jalasoft.com">ebascon@jalasoft.com</a></font></p>     <p align="center">&nbsp;</p>     ]]></body>
<body><![CDATA[<p align="center">&nbsp;</p> <hr align="JUSTIFY" noshade>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>1.&nbsp; &nbsp; Introducción</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Durante el proceso de enseñanza de programación, los docentes tienen que luchar contra el hábito natural que la mayoría de los estudiantes tienen de solucionar los problemas en largas, desordenadas, incomprensibles y enormes cantidades de código que mezclan algoritmos de procesamiento de datos, combinaciones de colores, mensajes al usuario, iconos animados, gráficos de barras y otras cosas más que hacen de ese código difícil de leer, de comprender y por tanto, de ser modificado, mantenido y extendido. El algoritmo 1 muestra esta mala forma de resolver un problema:</font></p>     <p align="center"><img src="/img/revistas/ran/v2n4/a05_algoritmo_01.gif" width="567" height="250"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Como se puede ver, el algoritmo anterior mezcla acceso a bases de datos, introducción de datos, despliegue de resultados, procesos de búsqueda, salida de mensajes de error y gráficos estadísticos en un simple bloque de código y, aunque se ve exagerado, una enorme cantidad de aplicaciones hechas a medida y aplicaciones web desarrolladas</font> <font face="Verdana, Arial, Helvetica, sans-serif" size="2">en nuestro medio están implementadas de esa manera. Si bien éste es un error causado por un mal hábito del programador, las herramientas de desarrollo rápido de aplicaciones (RAD<sup>1</sup>) como Delphi, Visual Basic y los lenguajes de <i>scripting </i>de desarrollo de aplicaciones web (ASP<sup>2</sup> , JSP<sup>3</sup> o PHP<sup>4</sup>) contribuyen a crear esa clase de aplicaciones muy fáciles de implementar, pero muy desorganizadas y difíciles de comprender y modificar. El patrón de diseño presentado en el presente artículo, plantea un método formal para separar los módulos de entrada, de procesamiento y de salida de datos en una aplicación y la forma de comunicación entre dichos módulos; también se verán las características, ventajas y desventajas de la implementación de este patrón de diseño en la librería de interfaz de usuario Java Swing.</font></p>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>2.&nbsp; &nbsp; El patrón de diseño Modelo-Vista-Controlador</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Durante toda la década del setenta, SmallTalk y algunos otros lenguajes como Simula I, fueron construyendo gradualmente el paradigma de programación orientada a objetos y estableciendo conceptos tales como objetos, clases, encapsulación, herencia y polimorfismo [3]. Si bien dichos lenguajes no son usados actualmente para implementar aplicaciones comerciales, los conceptos que dejaron en el mundo del desarrollo de software están vigentes en la actualidad y son la base de lenguajes modernos como C++, Java o C#.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">SmallTalk también fue el primer lenguaje de programación que permitió diseñar interfaces de usuario con múltiples &quot;ventanas&quot; desplegadas en una misma pantalla, concepto que después fue aplicado por GEMS, Macintosh, X11, Windows y otras interfaces gráficas de usuario modernas. El concepto central detrás de las librerías de interfaz de usuario provistas por SmallTalk está basado en el patrón de diseño MVC, creado por el profesor Trygve Reenskaug [4].</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">MVC es un patrón de diseño que considera dividir una aplicación en tres módulos claramente identificables y con funcionalidad bien definida: El Modelo, las Vistas y el Controlador.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.1.&nbsp; &nbsp; El modelo</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El modelo es un conjunto de clases que representan la información del mundo real que el sistema debe procesar, así por ejemplo un sistema de administración de datos climatológicos tendrá un modelo que representará la temperatura, la humedad ambiental, el estado del tiempo esperado, etc. sin tomar en cuenta ni la forma en la que esa información va a ser mostrada ni los mecanismos que hacen que esos datos estén dentro del modelo, es decir, sin tener relación con ninguna otra entidad dentro de la aplicación.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El modelo desconoce la existencia de las vistas y del controlador. Ese enfoque suena interesante, pero en la práctica no es aplicable pues deben existir interfaces que permitan a los módulos comunicarse entre sí, por lo que SmallTalk sugiere que el modelo en realidad esté formado por dos submódulos: El modelo del dominio y el modelo de la aplicación. El presente artículo utiliza la propuesta de SmallTalk por ser la base de la implementación de la librería Swing que es vista más adelante.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b><i>2.1.1.&nbsp; &nbsp; Modelo del dominio</i></b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Se podría decir que el modelo del dominio (o el modelo propiamente dicho) es el conjunto de clases que un ingeniero de software modela al analizar el problema que desea resolver; así, pertenecerían al modelo del dominio: El cliente, la factura, la temperatura, la hora, etc. El modelo del dominio no debería tener relación con nada externo a la información que contiene.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b><i>2.1.2.&nbsp; &nbsp; Modelo de la aplicación</i></b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El modelo de la aplicación es un conjunto de clases que se relacionan con el modelo del dominio, que tienen conocimiento de las vistas y que implementan los mecanismos necesarios para notificar a éstas últimas sobre los cambios que se pudieren dar en el modelo del dominio. El modelo de la aplicación es llamado también <i>coordinador de la aplicación.</i>[4]</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.2.&nbsp; &nbsp; Las vistas</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Las vistas son el conjunto de clases que se encargan de mostrar al usuario la información contenida en el modelo. Una vista está asociada a un modelo, pudiendo existir varias vistas asociadas al mismo modelo; así por ejemplo, se puede tener una vista mostrando la hora del sistema como un reloj analógico y otra vista mostrando la misma información como un reloj digital.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Una vista obtiene del modelo solamente la información que necesita para desplegar y se actualiza cada vez que el modelo del dominio cambia por medio de notificaciones generadas por el modelo de la aplicación. [2]</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.3.&nbsp; &nbsp; El controlador</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El controlador es un objeto que se encarga de dirigir el flujo del control de la aplicación debido a mensajes externos, como datos introducidos por el usuario u opciones del menú seleccionadas por él. A partir de estos mensajes, el controlador se encarga de modificar el modelo o de abrir y cerrar vistas. El controlador tiene acceso al modelo y a las vistas, pero las vistas y el modelo no conocen de la existencia del controlador. [3]</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">La <a href="#f1">figura 1</a> muestra la relación entre los módulos de MVC:</font></p>     <p align="center"><a name="f1"></a><img src="/img/revistas/ran/v2n4/a05_figura_01.gif" width="393" height="317"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.4.&nbsp; &nbsp; Un ejemplo</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Tomemos como ejemplo una aplicación hecha para almacenar y procesar los datos de las elecciones municipales.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El modelo del dominio sería bastante simple: Un conjunto de votos, un conjunto de mesas y un conjunto de departamentos. Cada voto almacenaría la selección hecha por el votante y la mesa donde emitió su voto. Cada mesa contendría información sobre el lugar de votación y el departamento donde estaría ubicada.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El conjunto de vistas sobre el modelo también sería sencillo: Se podría obtener un gráfico estadístico de votos por departamento en barras, otro gráfico de votos por departamento mostrado como torta, el conjunto de votos totales en una tabla, el conjunto de votos totales en barras o en torta, etc. Como se puede ver, aunque todas las vistas estarían mostrando la información de diferente manera, todas estarían asociadas al mismo modelo del dominio.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El controlador se encargaría de mostrar las vistas que el usuario desearía ver y de permitir al usuario introducir información de votos. Si el usuario desearía ver una vista, el controlador crearía la vista solicitada, esta vista obtendría la información necesaria del modelo y la desplegaría. Si el usuario aumentaría información de votos al sistema, el controlador se encargaría de actualizar la información contenida en el modelo del dominio que, al ser modificado, anunciaría al modelo de la aplicación la existencia de cambios y éste notificaría a todas sus vistas asociadas para que se actualicen [2]. De esta manera, las vistas estarían siempre actualizadas mostrando exactamente la misma información contenida en el modelo.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.5.&nbsp; &nbsp; Ventajas</b></font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Desarrollar una aplicación siguiendo este patrón de diseño tiene muchas ventajas:</font></p>     <blockquote>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; La aplicación está implementada modularmente.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Sus vistas muestran información actualizada siempre.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; El programador no debe preocuparse de solicitar que las vistas se actualicen, ya que este proceso es realizado automáticamente por el modelo de la aplicación.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Si se desea hacer una modificación al modelo del dominio, como aumentar métodos o datos contenidos, sólo debe modificarse el modelo y las interfaces del mismo con las vistas, no todo el mecanismo de comunicación y de actualización entre modelos.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Las modificaciones a las vistas no afectan en absoluto a los otros módulos de la aplicación.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; MVC es bastante utilizado en la actualidad en marcos de aplicación orientados a objeto desarrollados para construir aplicaciones de gran tamaño; Java Swing, Apache Struts, Microsoft ASP.NET, las transformaciones XSL o incluso los documentos LATEX siguen este patrón de diseño.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">• MVC está demostrando ser un patrón de diseño bien elaborado pues las aplicaciones que lo implementan presentan una extensibilidad y una mantenibilidad únicas comparadas con otras aplicaciones basadas en otros patrones.</font></p> </blockquote>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>2.6.    Desventajas</b></font></p>     ]]></body>
<body><![CDATA[<blockquote>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; El tiempo de desarrollo de una aplicación que implementa el patrón de diseño MVC es mayor, al menos en la primera etapa, que el tiempo de desarrollo de una aplicación que no lo implementa, ya que MVC requiere que el programador implemente una mayor cantidad de clases que en un entorno de desarrollo común no son necesarias. Sin embargo, esta desventaja es muy relativa ya que posteriormente, en la etapa de mantenimiento de la aplicación, una aplicación MVC es muchísimo más mantenible, extensible y modificable que una aplicación que no lo implementa.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; MVC requiere la existencia de una arquitectura inicial sobre la que se deben construir clases e interfaces para modificar y comunicar los módulos de una aplicación. Esta arquitectura inicial debe incluir, por lo menos: un mecanismo de eventos para poder proporcionar las notificaciones que genera el modelo de aplicación; una clase Modelo, otra clase Vista y una clase Controlador genéricas que realicen todas las tareas de comunicación, notificación y actualización que serán luego transparentes para el desarrollo de la aplicación.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; MVC es un patrón de diseño orientado a objetos por lo que su implementación es sumamente costosa y difícil en lenguajes que no siguen este paradigma.</font></p> </blockquote>     <p align="justify">&nbsp;</p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>3.&nbsp; &nbsp; MVC en Java Swing</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Java es un lenguaje orientado a objetos desarrollado por Sun Microsystems que tiene como características fundamentales su portabilidad a un gran número de plataformas (Java es en sí una plataforma), su simplicidad y su extenso conjunto de librerías.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">La librería de interfaces gráficas de usuario que viene en el SDK<sup>5</sup> de Java se llama Java Swing y tiene estas características sobresalientes:</font></p>     <blockquote>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Implementa bastantes componentes visuales (botones, campos de texto, tablas, barras de menús, árboles, etc.).</font></p>       ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Los componentes provistos por Java Swing son independientes de la plataforma donde se ejecuta la aplicación (contrario a la idea de AWT<sup>6</sup> , otra librería de interfaces de usuario de Java, que utiliza componentes nativos de la interfaz de usuario del sistema operativo donde se ejecuta la aplicación) y por tanto, la portabilidad de las aplicaciones desarrolladas con Swing está garantizada.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Permite &quot;conectar&quot; y &quot;desconectar&quot; estilos de interfaz de usuario (llamados &quot;look and feels&quot;) que modifican la forma en que se muestra y se comporta toda la interfaz de usuario, así, la misma aplicación puede verse como una aplicación Windows o como una aplicación Motif<sup>7</sup> simplemente conmutando el <i>look and feel </i>en tiempo de ejecución.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Cumple con el diseño de JavaBeans que hace que los componentes de esta librería puedan ser utilizados en entornos de desarrollo integrados (IDEs) como JBuilder, Sun Forte for Java o Eclipse.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Su arquitectura está profundamente basada en MVC, lo que proporciona un alto grado de extensibilidad y de personalización de los componentes de la librería.</font></p> </blockquote>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>3.1.&nbsp; &nbsp; Arquitectura de Java Swing</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Si bien Swing se basa en el patrón de diseño MVC, presenta algunas diferencias en su implementación: La diferencia más notoria es que el control ador y la vista están implementados como un único elemento denominado &quot;delegado de interfaz de usuario&quot; (&quot;UI delegate&quot;). Cada componente está asociado a un conjunto de datos (modelo del dominio) a través de un modelo de aplicación y del delegado de interfaz. Este delegado ha sido diseñado debido a la incapacidad de programar un controlador genérico con conocimiento de la vista a la que hubiera podido controlar, por tanto, cada componente tiene asociado un delegado de interfaz que a su vez, está asociado a un modelo de aplicación que proporciona toda la información que el delegado requiere y que notifica </font><font face="Verdana, Arial, Helvetica, sans-serif" size="2">al componente si algún cambio se ha dado en el modelo del dominio [5]; por tanto, Java Swing implementa el modelo MVC en una implementación por componente.</font></p>     <p align="center"><a name="f2"></a><img src="/img/revistas/ran/v2n4/a05_figura_02.gif" width="474" height="195"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">En la <a href="#f2">figura 2</a> se observa también la existencia de un elemento denominado &quot;administrador de interfaz de usuario&quot; (&quot;UI manager&quot;); este elemento permite conectar un <i>look and feel </i>específico a cada componente visualizado y almacena también información general a la apariencia de los componentes en su visualización (color de fondo por defecto, tipo de letra por defecto, tipos de bordes, etc.). Todos los componentes de Swing están manejados por el mismo administrador de interfaz de usuario.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Los modelos implementados en Swing están clasificados en dos categorías: Modelos de estado de interfaz de usuario y modelos de datos. Los modelos de estado de interfaz definen el estado visual de un componente, como por ejemplo, el estado de un botón está presionado o información de los ítems seleccionados en determinada lista. Los modelos de datos representan información que está contextualizada en la aplicación. Estos modelos de datos sirven como puente de comunicación entre el modelo del dominio y el delegado de interfaz de un componente.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El <a href="#c1">cuadro 1</a> muestra la relación entre los componentes de Java Swing, sus delegados de interfaz y el modelo que tienen asociado [1].</font></p>     ]]></body>
<body><![CDATA[<p align="center"><a name="c1"></a><img src="/img/revistas/ran/v2n4/a05_cuadro_01.gif" width="589" height="412"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>3.2.&nbsp; &nbsp; Modelos y componentes</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Como se pudo ver hasta el momento, cada tipo de componente tiene asociado un tipo particular de modelo de aplicación. Swing provee estos tipos de modelo como in-terfaces (declaraciones de métodos sin implementaciones, por ejemplo el TableModel), además proporciona modelos por defecto (DefaultTableModel) que proporcionan funcionalidad básica y lista para usarse. La ventaja de que los modelos de aplicación sean implementados como interfaces, es que el desarrollador puede implementar un modelo de aplicación adecuado al modelo del dominio que tiene, sin tener que reestructurar sus datos según requerimientos de Swing.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Veamos todo esto con un ejemplo: Se desea hacer un programa que muestre en una tabla una lista de personas, para lo cual se implementa primeramente una clase Persona que tenga nombre, apellido, carnet de identidad y teléfono como atributos:</font></p>     <blockquote>       <p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_01.gif" width="562" height="784"></p> </blockquote>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Luego se construye una clase denominada ListaDePersonas que implementa los métodos para agregar y acceder a las personas a la lista:</font></p>     <blockquote>       <p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_02.gif" width="564" height="548"></p> </blockquote>     <p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las clases Persona y ListaDePersonas se constituyen en el modelo del dominio de la aplicación de ejemplo. Para que este modelo pueda ser mostrado por un elemento de interfaz, debe construirse un modelo de aplicación, en este caso, la clase PersonasTableModel que se basa en la clase AbstractTableModel que define la funcionalidad básica del modelo de la tabla:</font></p>     ]]></body>
<body><![CDATA[<blockquote>       <p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_03.gif" width="572" height="952"></p> </blockquote>     <p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los métodos implementados en la clase PersonasTableModel, son métodos definidos en la clase AbstractTableModel que se encargan de proporcionar toda la información que el delegado de la tabla necesita para mostrar esa información. Como se puede ver en el ejemplo, la clase PersonasTableModel sirve como un puente entre el modelo del dominio y el delegado de interfaz de usuario y permite que el componente se adapte a la estructura de datos manejada.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Una vez definidas estas clases, se procede a colocar el componente JTable (asociado al modelo definido anteriormente) en una ventana:</font></p>     <blockquote>       <p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_04.gif" width="601" height="999"></p>       <p align="justify">&nbsp;</p> </blockquote>     <p align="center"><img src="/img/revistas/ran/v2n4/a05_figura_03.gif" width="485" height="270"></p>     <p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>3.3.    Notificaciones</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">A lo largo de todo este artículo hemos hablado de notificaciones hechas a las vistas debido a cambios ocurridos en el modelo. Java Swing maneja el paso de notificaciones por medio de un mecanismo de eventos y de &quot;escuchadores&quot; (&quot;listeners&quot;) de eventos.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Para que una vista se actualice debido al cambio de su modelo asociado, Swing provee dos tipos de notificaciones: Las notificaciones ligeras (&quot;lightweight&quot;) y las notificaciones de estado (&quot;stateful&quot;).</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Las <i>notificaciones ligeras </i>envían a las vistas un mensaje de &quot;modelo modificado&quot;. Es la vista la que debe solicitar al modelo más información sobre los cambios realizados. Este tipo de notificaciones es bastante til cuando la frecuencia de modificaciones al modelo es alta (como en el modelo del JScrollPane que se modifica cada que se arrastra el control del <i>scroll) </i>y es bastante usado en modelos que almacenan estado de interfaz. El <a href="#c2">cuadro 2</a> muestra los modelos, los <i>listeners </i>y los eventos que funcionan con esta clase de notificaciones:</font></p>     <p align="center"><a name="c2"></a><img src="/img/revistas/ran/v2n4/a05_cuadro_02.gif" width="577" height="125"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El segmento de código 5 muestra cómo el método <b>stateChanged </b>procesa notificaciones cuando el modelo de un botón es modificado:</font></p>     <blockquote>       <p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_05.gif" width="591" height="347"></p> </blockquote>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Las <i>notificaciones de estado </i>proporcionan información mucho más precisa sobre el cambio que se ha dado en el modelo. El <a href="#c3">cuadro 3</a> muestra los modelos, los listeners y los eventos que funcionan con esta clase de notificaciones:</font></p>     <p align="center"><a name="c3"></a><img src="/img/revistas/ran/v2n4/a05_cuadro_03.gif" width="581" height="210"></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">En el segmento de código 6 se ve cómo el método <b>insertUpdate </b>se encarga de procesar las notificaciones de estado cuando se inserta texto en el documento de un campo de texto:</font></p>     <blockquote>       ]]></body>
<body><![CDATA[<p align="justify"><img src="/img/revistas/ran/v2n4/a05_segmento_06.gif" width="587" height="466"></p> </blockquote>     <p align="center">&nbsp;</p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>3.4.    Ventajas</b></font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">La implementación de Swing del patrón de diseño MVC presenta muchas ventajas:</font></p>     <blockquote>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Permite la creación de interfaces de usuario de una manera sencilla y rápida, permitiendo el manejo del patrón MVC pero ocultando los detalles de su imple-mentación.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; El mecanismo de eventos de Java se adapta perfectamente al mecanismo de notificaciones de MVC.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Al estar los modelos separados de la vista, las posibilidades de extensión de la librería y de personalización de componentes ya existentes son enormes.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Permite al usuario crear sus propias estructuras de datos y adaptar la interfaz de usuario a ellas y no a la inversa, como sucede con librerías ya implementadas.</font></p> </blockquote>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>3.5.    Desventajas</b></font></p>     ]]></body>
<body><![CDATA[<blockquote>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>•</b>&nbsp; La principal desventaja de esta implementación es que, aunque la arquitectura de Java Swing lo permite, la personalización y extensión de los modelos de algunos componentes (especialmente tablas y árboles), es bastante dificultosa.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; Los modelos de estado y los modelos de datos de Java Swing no están claramente diferenciados en la implementación y, si bien el modelo de datos es la implementación del modelo de la aplicación, el modelo de estado está muy alejado de la definición de modelo que MVC introdujo.</font></p>       <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">•&nbsp; El controlador definido por MVC es casi inexistente en Java Swing y su trabajo puede confundirse con el del administrador de interfaz de usuario.</font></p> </blockquote>     <p align="justify">&nbsp;</p>     <p><b><font size="3" face="Verdana, Arial, Helvetica, sans-serif">Notas</font></b></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>1</sup>Rapid Application Development, entornos de desarrollo integrados que proporcionan todos los mecanismos para construir r&aacute;pidamente aplicaciones.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>2</sup>Active Server Pages, (P&aacute;ginas de Servidor Activas), tecnolog&iacute;a de Microsoft para desarrollo de aplicaciones web.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>3</sup> Java Server Pages, arquitectura similar a ASP pero para plataformas Java.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>4</sup>PHP: Arquitectura similar a ASP pero desarrollada para plataformas Linux.</font></p>     ]]></body>
<body><![CDATA[<p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>5</sup>SDK: Software Development Kit, en el caso de Java es el conjunto de clases provistas por Sun Microsystems para desarrollar aplicaciones.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>6</sup>AWT: Abstract Windowing Toolkit, primera librer&iacute;a de interfaz de usuario de Java, Swing utiliza un conjunto muy peque&ntilde;o de las clases de AWT como base de su arquitectura.</font></p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><sup>7</sup>Motif, estilo de interfaz de usuario implementado en CDE (Common Desktop Environment), una interfaz de usuario bastante difundida en entornos UNIX.</font></p>     <p>&nbsp;</p>     <p align="justify"><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>Referencias</b></font></p>     <!-- ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">[1] Java Swing architecture. <a href="http://www.cs.unc.edu/Courses/wwwp-s99/members/walkera/swing/presentSwingII.htm">http://www.cs.unc.edu/Courses/wwwp-s99/members/walkera/swing/presentSwingII.htm</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=815924&pid=S1683-0789200400010000500001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  [2] Joseph Bergin. Building Graphical User Interfaces  with the MVC pattern. <a href="http://csis.pace.edu/bergin/mvc/mvcgui.html">http://csis.pace.edu/bergin/mvc/mvcgui.html</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=815925&pid=S1683-0789200400010000500002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  [3] Steve Burbeck. Applications Programming in  Smalltalk-80(TM): How to use Model-View-Controller (MVC). <a href="http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html">http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=815926&pid=S1683-0789200400010000500003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  [4] John Deacon. Model-View-Controller (MVC)  Architecture. <a href="http://www.jdl.co.uk/briefings/mvc.pdf">http://www.jdl.co.uk/briefings/mvc.pdf</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=815927&pid=S1683-0789200400010000500004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  [5] Amy Fowler. A Swing architecture overview. <a href="http://java.sun.com/products/jfc/tsc/articles/architecture/">http://java.sun.com/products/jfc/tsc/articles/architecture/</a>.</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=815928&pid=S1683-0789200400010000500005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><p align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">  [6] Sun Microsystems. JavaTM 2 Platform, Standard Edition, v 1.4.2, API  Specification. <a href="http://java.sun.com/products/jdk1.4/doc">http://java.sun.com/products/jdk1.4/doc</a>. </font></p>     <p align="justify">&nbsp;</p>      ]]></body><back>
<ref-list>
<ref id="B1">
<label>1</label><nlm-citation citation-type="">
<source><![CDATA[Java Swing architecture]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B2">
<label>2</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Bergin]]></surname>
<given-names><![CDATA[Joseph]]></given-names>
</name>
</person-group>
<source><![CDATA[Building Graphical User Interfaces with the MVC pattern]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B3">
<label>3</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Burbeck]]></surname>
<given-names><![CDATA[Steve]]></given-names>
</name>
</person-group>
<source><![CDATA[Applications Programming in Smalltalk-80(TM): How to use Model-View-Controller (MVC)]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B4">
<label>4</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Deacon]]></surname>
<given-names><![CDATA[John]]></given-names>
</name>
</person-group>
<source><![CDATA[Model-View-Controller (MVC) Architecture]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B5">
<label>5</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Fowler]]></surname>
<given-names><![CDATA[Amy]]></given-names>
</name>
</person-group>
<source><![CDATA[A Swing architecture overview]]></source>
<year></year>
</nlm-citation>
</ref>
<ref id="B6">
<label>6</label><nlm-citation citation-type="">
<collab>Sun Microsystems</collab>
<source><![CDATA[JavaTM 2 Platform, Standard Edition, v 1.4.2. API Specification]]></source>
<year>2000</year>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
