Nuestra intención: hacer un programa que pueda ser controlado desde un GUI, ejemplo: hacer clic sobre los enlaces que aparecen en la ventana de un navegador web.
El problema: Las aplicaciones gráficas que hemos hecho no son demasiado interactivas con el usuario. Hasta ahora, los únicos mecanismos de comunicación con el usuario que teníamos eran:
Claramente necesitamos otro mecanismo de comunicación adicional, que nos permita una interacción directa entre el usuario y el programa, de forma específica para nuestro programa y continuada a lo largo de su ejecución.
Solución: Algunos componentes gráficos pueden ser configurados para ejecutar un cierto código cuando el usuario interacciona con ellos.
SWING desarrolla este sistema de "componentes gráficos configurables" mediante la metáfora de los eventos.
Antes de empezar con la práctica, asegúrate de entender el modelo de eventos de SWING. Repasa los apuntes de teoría sobre el tema si es preciso.
Escribe un programa Simple00GUI que presente una ventana con un botón. Cada vez que se pulse el botón, se imprimirá un texto por la salida estándar.
Escribe un programa Simple01GUI que presente una ventana con un botón y una etiqueta. Cada vez que se pulse el botón, se cambiará el color de fondo de la etiqueta. ¿Qué hilo está haciendo el cambio del color del fondo de la etiqueta?
Escribe un programa Simple02GUI que presente una ventana con un botón y una etiqueta. Cada vez que se pulse el botón, se cambiará el color de fondo de la etiqueta. Cada vez que el usuario introduzca un "enter" por la entrada estándar, se cambiará también el color de la etiqueta. ¿Qué hilo está haciendo el cambio del color del fondo de la etiqueta?, ¿estás seguro?. Utiliza Thread.getName() justo antes de cambiar el el color de la etiqueta para asegurarte de que sólo un único thread modifica la interfaz gráfica.
Escribe una clase DataBase que simule una base de datos de alumnos. La base de datos relaciona el NIA con el nombre del alumno. La base de datos tiene que tener al menos dos métodos:
Es probable que el método Thread.interrupted() te resulte interesante para hacer este apartado.
Introduce unos pocos NIAs y nombres al azar en la base de datos y programa un sencillo método main para comprobar que la clase funciona correctamente.
Escribe un programa DataBaseGUI con tres botones, una etiqueta y un campo de texto. Uno de los botones cambia el color de la etiqueta, el otro hace una búsqueda en la base de datos usando como NIA el contenido del campo de texto. El tercer botón interrumpe una busqueda. El resultado de la búsqueda se mostrará en la etiqueta.
Tendrás que tener en cuenta algunas cosas como, por ejemplo, evitar que el usuario lanze nuevas búsquedas mientras otra está en curso. Si no tienes cuidado con la sincronización entre hilos, la interfaz gráfica podría quedarse congelada durante la búsqueda, procura evitarlo.
Para mostrar visiblemente esta limitación al usuario, el botón de búsqueda se mantendrá pulsado, el campo de texto no será editable y la etiqueta mostrara ".", ".." y "..." secuencialmente cada segundo mientras dura la búsqueda. Cuando la búsqueda haya finalizado o se haya interrumpido, la interfaz debe volver a la normailidad.
Este ejercicio es complejo, dedica un tiempo a dibujar los hilos involucrados y como se relacionan entre si.
Crea un programa Notepad basándote en el notepad de Microsoft. No olvides los barras de desplazamiento, los menús, mostrar algún diálogo, radio buttons y demás.
Este último ejercicio está pensado para que practiques los diferentes componentes gráficos. Céntrate en eso, no en la funcionalidad real del programa; por ejemplo, céntrate en mostrar un menú para imprimir el documento, pero no en que el documento se mande a imprimir realmente, bastaría con un mensaje por salida estándar diciendo "El documento se mandó a imprimir".
La complejidad gráfica de este apartado es superior a la de los anteriores, te vendría bien dibujar cada ventana, diálogo o menú con antelación. También estaría bien que fueras fijando los nombres de los objetos gráficos necesarios con antelación. Otra precaución imprescindible es ir añadiendo componentes gráficos uno a uno sobre una base probada y funcional.
Created by alcortes at 2007-05-10.
Modified by alcortes at 2008-04-25, updated.