Diseño y
Programación Orientados a Objetos
1er. Sem 2019
Tarea 2: Aplicación Gráfica para Semáforos en Intersección
Lea detenidamente la tarea. Si algo no lo entiende, consulte en clases. Si
es preciso, se incorporarán aclaraciones al final.
Objetivos de la tarea:
* Manejar proyectos vía GIT.
* Crear Interfaces gráficas en Java.
* Manejar eventos de software.
* Ejercitar la creación y extensión de clases para satisfacer nuevos
requerimientos.
* Ejercitar el patrón de diseño "Modelo-Vista-Controlador".
* Generar documentación usando Javadoc.
Descripción General
En esta tarea se pide crear una interfaz gráfica para la
simulación de los semáforos de la intersección de las Avenidas Manuel
Antonio Matta y Los Placeres. Si bien no se simulan todos los semáforos
(en la realidad algunos de ellos están duplicados), se incorpora botones
para solicitar verde en los dos cruces peatonales y se simula un sensor
inductivo para otorgar el derecho a girar a la izquierda desde Avda.
Placeres hacia Avenida Matta. Ver figura 1.
Figura 1: Esquema general como idea para
organizar interfaz usuario
La interfaz se divide en dos zonas. La superior incluye el bosquejo de la
intersección y los semáforos señalados en Figura1. Cada semáforo puede ser
representado visualmente como su grupo estime. Más abajo se acompaña un
programa ejemplo y ayuda que puede usar como referencia. La parte inferior
de la interfaz contiene tres botones que representarán los botones de los
cruces peatonales y el del medio el sensor inductivo para giro. Cada botón
debe incluir una imagen que reflejará el requerimiento de cruce o giro.
Mientras un controlador otorgará secuencialmente autorización de avanzar
a cada semáforo de manera similar a como ocurre en aquella intersección,
el usuario podrá presionar los botones para solicitar cruce o giro. Así se
simulará la llegada de peatones y autos a girar. Ante esto el controlador
pondrá en verde el semáforo de cruce o giro cuando corresponda el turno
para ese semáforo dentro de la secuencia.
Desarrollo en Etapas
Para llegar al resultado final de esta tarea usted aplicará la metodología
"Iterativa e Incremental" para desarrollo de software. Su grupo irá
desarrollando etapas que irán abordando los requerimientos gradualmente. En
cada etapa usted obtendrá una solución que funciona para un subconjunto de
los requerimientos finales. Su grupo
deberá entregar una solución para cada una de las etapas aún cuando
la última integre las primeras. El readme y archivo de documentación
deben ser preparados solo para la última etapa. Prepare un makefile para
cada una de las etapas. Esto tiene por finalidad, educar en la
metodología iterativa e incremental.
Primera Etapa: Dos semáforos de calle y uno de cruce peatonal
Revise con detención el código proporcionado
para dos semáforos. Analice cada archivo y compare esta solución parcial
con lo que usted preparó en tarea 1. Extienda la aplicación proporcionada
para incorporar un tercer semáforo. Su vista debe corresponder a un
semáforo de calle (StreetTrafficLight). Elija usted la secuencia en que el
controlador les dará el paso.
Segunda Etapa: Paso peatonal con botón de solicitud de paso
Separe la ventana principal en dos zonas, una sobre la otra dentro del
JFrame. El layout por omisión (default) de JFrame
es el Border Layout. Considere poner la intersección de calles en el
centro y un botón en la parte inferior. Al presionar el botón debe cambiar
su vista de manera similar al ejercicio hecho en la clase del 17.04.19.
Haga los cambios necesarios para que el paso peatonal pase a verde dentro
de la secuencia solo si su botón ha sido requerido. Mientras no haya
requerimiento, la autorización de paso se turna entre los otros dos
semáforos.
Tercera Etapa: Vista para semáforo de giro
Cree la clase TurnTrafficLight. Se sugiere revisar nuevamente la clase
CrosswalkTrafficLight antes de crear esta vista nueva para un semáforo.
Agregue una instancia de semáforo de giro a los tres semáforos previos.
Incluya un botón acorde para solicitar paso en el semáforo de giro. Use
dos imágenes de una bobina, una de ellas que denote detección de
auto. En esta etapa usted debe ver los cuatro semáforos operando de
manera secuencial y otorgando verde al paso peatonal y al semáforo de giro
solo si el botón correspondiente ha sido accionado. En cualquier caso el
paso sólo se otorga cuando corresponda para ese semáforo dentro de la
secuencia.
Cuarta Etapa: Simulación de intersección Avenida los Placeres con
Avenida Manuel Antonio Matta
En esta última etapa el programa debe mostrar una interfaz similar a la
Figura 1. Revise las clases Line2D.Double y clase Path2D.Double (notar uso
de clases estáticas anidadas). Instancias de estas clases pueden dibujarse
al igual que se hace con instancias de Ecllipse2D. Use una secuencia
semejante a la usada en la intersección real.
Resultados Esperados de su Grupo
Usted deberá documentar, usando notación "JavaDoc" las clases TrafficLight y
TurnTrafficLight de su última etapa.
Prepare un archivo makefile para
compilar y ejecutar su tarea en aragorn. Además incluya rótulos "clean" para
borrar todos los .class generados, y "doc" para generar la documentación en
directorio "documentation".
Entregue todo lo indicado en Normas de
Entrega de Tareas. Su documentación automática con javadoc debe ser
generable con:
$ make doc
Para que esto funcione usted debe incluir el rótulo doc en su archivo
makefile.
(OJO no incluya las páginas html generadas por javadoc, éstas serán
generadas por este comando cuando el ayudante revise su trabajo)
En su archivo de documentación (pdf o html) incorpore el diagrama de clases
de la aplicación (etapa 4). Éste lo puede generar con jgrasp u otro
programa.
Extra créditos
Su grupo puede aspirar a 5 puntos adicionales (la nota igualmente se satura
en 100%) si incorpora un menú para cambiar la duración del parpadeo a usar
en ambos semáforos peatonales (mismo valor para ambos) y otra opción para
cambiar la duración del parpadeo verde para el semáforo de giro. En archivo
Readme indique si abordó este requerimiento.
Ayudas
* Revise las instrucciones para la
realización de tareas.
* No dude en consultar al profesor o ayudantes sobre dudas de esta tarea.
Sobre la arquitectura Modelo Vista
Controlador
Para organizar interfaces gráficas una "solución de software general
recomendada" (éstas son conocidas como patrones
de diseño) es el patrón "modelo-vista-controlador".
El modelo es la clase que
caracteriza a un objeto y almacena los datos significativos de éste. Por
ejemplo, en este caso la clase TrafficLight maneja el modelo de un semáforo.
Por otro lado tenemos las vistas,
estas clases indican cómo un objeto se muestra visualmente. En nuestro caso
StreetTrafficLight y PedestrianTrafficLight son vistas para la clase
TrafficLight. En esta tarea, todos los semáforos se simularán de manera
similar; sin embargo, varios difieren en su representación visual. En otros
problemas puede ocurrir que un mismo modelo tenga varias vistas. Por ejemplo
un objeto termómetro tiene un modelo y podría mostrarse como columna de
mercurio, como número digital, como un color, etc. Finalmente tenemos el controlador. Las clases controladoras
son aquellas que modifican los datos, por ejemplo a través de las acciones
del usuario en la interfaz. Generalmente las clases controladoras son los
"listeners" o manejadores de los eventos que usted estima de interés. En
este caso la clase Controlador genera cambios en el estado de los semáforos.
Una clase puede cumplir dos roles, por ejemplo modelo y vista, como ocurre
en las clases hijas StreetTrafficLight y PedestrianTrafficLight. Así como
podemos tener varias vistas, es posible tener varias clases controladoras de
un modelo. Otras clases controladoras son el listener que responde a al
presionar un botón.