PDF. Desarrollo de Interfaces. Tema 5
PDF. Desarrollo de Interfaces. Tema 5
PDF. Desarrollo de Interfaces. Tema 5
Explotación de
componentes
visuales
05
/ 1. Introducción y contextualización práctica 4
/ 2. Características fundamentales 5
2.1. Introspección y reflexión 5
2.2. Persistencia del componente 5
/ 3. Pruebas unitarias 6
3.1. JUnit en Eclipse 7
3.2. Clase prueba 7
3.3. Métodos de prueba 7
3.4. Comprobación de errores 8
/ 4. Eventos: clases 8
/ 5. Eventos: componentes 9
/ 8. Eventos: métodos 12
© MEDAC 978-84-18983-19-1
Reservados todos los derechos. Queda rigurosamente prohibida, sin la autorización escrita de los titulares del copyright,
bajo las sanciones establecidas en las leyes, la reproducción, transmisión y distribución total o parcial de esta obra por
cualquier medio o procedimiento, incluidos la reprografía y el tratamiento informático.
/ 10. Caso práctico 1: “Configuración del ratón” 15
/ 13. Bibliografía 18
Crear componentes visuales.
Determinar los eventos a los que se debe responder desde una determinada
interfaz.
Por esta razón, todos los componentes descritos hasta ahora son necesarios. Sobre todo, la capacidad de
interactividad que estos pueden presentar, gracias a la aparición de los eventos.
Los eventos permiten que el usuario pueda establecer una «comunicación» con cualquier aplicación para que esta
se ajuste a las decisiones del usuario en lo que respecta a su recorrido
por un sitio web, aplicación o herramienta.
/ 2. Características fundamentales
Los componentes visuales son elementos clave para el desarrollo de interfaces. Su forma de utilización y estructura
característica son esenciales para la implementación de aplicaciones a través de su uso. De una forma ágil y sencilla,
liberan al desarrollador de los costes que supondría la creación de todos y cada uno de elementos visuales implicados
en una sola interfaz de aplicación.
Mediante la reflexión, es posible recuperar y modificar de forma dinámica diferentes datos relativos a la estructura
de un objeto: los métodos y propiedades de la clase, los constructores, las interfaces o el nombre original de la clase,
entre otros.
La introspección es una de las características más importantes en el desarrollo de interfaces, sobre todo cuando se
utilizan entornos visuales de diseño, puesto que permite a estas herramientas tomar de forma dinámica todos los
métodos, propiedades o eventos asociados a un componente, que se colocan sobre el lienzo de diseño simplemente
arrastrando y soltando el elemento.
Por lo tanto, la introspección de los componentes visuales requiere de la reflexión para funcionar correctamente.
Ambas propiedades son dos características clave en el diseño de JavaBean que vimos en el tema anterior.
/ 3. Pruebas unitarias
El desarrollo de pruebas de software es importante en la implementación
de nuevos componentes, puesto que, de esta forma, se reducen
considerablemente los tiempos de desarrollo. Si se ha probado y verificado
el comportamiento de un componente, esta acción ya no será necesaria,
aunque sí habría que verificar cómo sería su uso en el marco de otro proyecto Fig. 3. Logo JUnit.
que lo utilice.
Las pruebas se diseñan en base al comportamiento esperado de un componente, extendiéndose a todas las
casuísticas posibles.
Las pruebas unitarias son pruebas que se realizan sobre una funcionalidad concreta, es decir, sobre una parte del
programa, con el objetivo de comprobar si funciona de forma correcta. Para el desarrollo de pruebas unitarias,
encontramos el framework de Java, JUnit. Para intalarlo, basta con incorporar algunas librerías JAR al entorno
de desarrollo.
• Rápida ejecución
import junit.framework.TestCase;
public class TestCalculadora extends TestCase{…}
/ 4. Eventos: clases
La programación basada en eventos es la clave de la iteración entre el usuario y una interfaz. Sin la existencia de
esta, solo tendríamos textos, imágenes o cualquier otro elemento. Este tipo de programación podría dividirse en
dos grandes bloques: la detección de los eventos y las acciones asociadas a su tratamiento. Podemos decir que la
programación basadas en componentes y la basada en eventos se encuentran estrechamente ligadas, puesto que la
finalidad de gran parte de los componentes descritos en el capítulo anterior es la recogida de información directa a
través de la comunicación e interacción con el usuario. En función del origen del evento, es decir, de dónde se haya
producido, diferenciamos entre eventos internos y externos:
• Eventos internos. Este tipo de eventos está producido por el propio sistema.
• Eventos externos. Los eventos externos son aquellos producidos por el usuario, habitualmente, a través del
teclado o del puntero del ratón.
Los objetos que definen todos los eventos que se verán en este tema se basan en las siguientes clases, o en varias de
estas, puesto que existen relación de herencia entre ellas.
Clase Descripción
ContainerEvent Evento producido al añadir o eliminar componente sobre un objeto de tipo Container
Este tipo de eventos se produce cuando una ventana ha sufrido algún tipo
WindowsEvent
de variación, desde su apertura o cierre, hasta el cambio de tamaño
/ 5. Eventos: componentes
Los componentes utilizados para el desarrollo de interfaces presentan, habitualmente, un tipo de evento asociado.
No es lo mismo el tipo de detección asociado a un botón o a la pulsación de una tecla, que la forma de detección de
la apertura o cierre de una ventana.
En la siguiente tabla, se muestran los componentes más habituales y el tipo de evento asociado a estos.
Nombre
Nombre evento Descripción del evento
componente
Detecta la pulsación de la tecla Enter
JTextField ActionEvent
tras completar un campo de texto
JComboBox ActionEvent ItemEvent Se detecta la selección de uno de los valores del menú
A continuación, se verán todos los tipos de listeners asociados al tipo de evento al que corresponden. Como se puede
observar, un mismo tipo de escuchador puede estar presente en varios eventos y componentes diferentes, aunque,
normalmente, presentan un comportamiento muy similar.
6.1. KeyListener
Este evento se detecta al pulsar cualquier tecla. Bajo este escuchador, se contemplan varios tipos de pulsaciones,
cada uno de los cuales presentará un método de control propio. Se implementan los eventos ActionEvent.
Se produce al pulsar
keyTyped
y soltar la tecla
6.2. ActionListener
Este evento detecta la pulsación sobre un componente. Está presente en varios tipos de elementos y es uno de los
escuchadores más comunes.
La detección tiene lugar ante dos tipos de acciones: la pulsación sobre el componente con la tecla Enter, siempre
que el foco esté sobre el elemento; o la pulsación con el puntero del ratón sobre el componente. Estos componentes
implementan los eventos de tipo ActionEvent.
Componente Descripción
JTextField Al pulsar la tecla Enter con el foco situado sobre la caja de texto
JList Al hacer doble clic sobre uno de los elementos del componente lista
Este evento se produce al hacer clic sobre algún componente. Es posible diferenciar entre distintos tipos de
pulsaciones y asociar a cada una de ellas una acción diferente.
Modo de
Definición
pulsación
Se produce al pulsar y soltar con el puntero
mouseClicked
del ratón sobre el componente
• FocusListener
Este evento se produce cuando un elemento está seleccionado o deja de estarlo, es decir, al tener el foco sobre el
componente o dejar de tenerlo.
• MouseMotionListener
Mientras que el caso anterior detecta la acciones con el puntero en cuanto a pulsar o soltar las teclas del ratón, este
nuevo evento se produce ante la detección del movimiento del ratón.
/ 8. Eventos: métodos
Cada uno de los eventos detallados en los apartados anteriores utilizará un método para el tratamiento del mismo,
es decir, tras enlazar al escuchador con la ocurrencia de un evento, será necesario ejecutar un método u otro en
función del tipo de evento asociado.
En la siguiente tabla, se muestra la relación entre el Listener y el método propio de cada evento:
Listener Métodos
En primer lugar, se crea una nueva instancia del evento y este se vincula con el componente sobre el que va a actuar.
TÉCNICO EN DESARROLLO DE APLICACIONES MULTIPLATAFORMA
/ 13 MEDAC · Instituto Oficial de Formación Profesional
Para que se produzca esta detección, será necesario enlazar el evento con los escuchadores, elementos que se
encuentren a la espera de que se produzca algún evento (Listeners). Estos elementos son interfaces que implementan
un conjunto de métodos.
Sintaxis 1:
nombreComponente.addtipoEventoListener(new tipoEventoListener()
{…}
Sintaxis 2:
El valor de tipoEventoListener se obtiene de las tablas del apartado 4, escogiéndolo en función del evento que se
vaya a tratar.
Cuando se activa y vincula un escuchador o listener a un componente y, por tanto, a la ocurrencia de un evento, los
componentes no realizan un filtrado previo de los eventos para determinar si los manejan o no, sino que los reciben
todos. A través de la asociación de la acción al evento se determinará si se maneja el evento o no.
A continuación, se implementa el método bajo el cual se desarrolla la acción, que se ejecutará tras la ocurrencia del
evento, ya sea la pulsación sobre un botón, selección con el ratón, marcado en una lista de componentes o escritura
a través del teclado, entre otros.
En el lenguaje de programación Java, cada evento está asociado a un objeto de la clase EventObject y, por lo tanto, a
un método concreto. La estructura general para la definición de este método sigue el siguiente patrón:
Los métodos relativos a cada evento, prestando especial atención a las diferentes casuísticas que presentan algunos
eventos, son los estudiados en el apartado 4.
En primer lugar, se crea una nueva clase JFrame y se inserta un panel JPanel para ubicar encima el resto de elementos.
TEMA 5. EXPLOTACIÓN DE COMPONENTES VISUALES
Desarrollo de interfaces / 14
Se coloca una etiqueta y un botón, en la distribución que se desee, desde la vista de diseño. En la parte del código,
de forma automática, se habrá generado:
Y ahora, ¿cómo se crea el código relativo a la producción y detección de eventos para cada componente?
Desde la vista de diseño, hacemos doble clic sobre el botón, lo que nos lleva al código, donde ahora aparecen algunas
líneas nuevas.
btnNewButton.addActionListener(new ActionListener({
De forma automática, se implementa tanto el escuchador vinculado al botón (ActionListener) como el método
dentro del cual se desarrollan las acciones desencadenadas por el evento (actionPerformed), que recibe por
parámetro un ObjectEvent de tipo ActionEvent.
Finalmente, solo quedará colocar el código que envía a la etiqueta de texto creada en el inicio el mensaje «Hola
Mundo» y la muestra por pantalla.
Nudo: Para implementar los eventos escuchadores asociados al JSpinner y al JComboBox. será necesario utilizar:
• En el caso del JSpinner. para capturar la velocidad establecida por el usuario. se utilizará el evento de cambio
de estado:
spinner1.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
combo1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
TEMA 5. EXPLOTACIÓN DE COMPONENTES VISUALES
Desarrollo de interfaces / 16
• Cuando se detecte el cambio de estado del componente JSpinner, se llamará al método de ‘pintar’ para
dibujar la barra de progreso con el color y longitud apropiados. Si la velocidad seleccionada es 0, la longitud
de la barra será de 20px y el color será el rojo. Si es 25, será de color naranja y longitud 40px. Por último, en
el caso de ser velocidad 50, la barra será de longitud 60px y de color verde.
if(spinner1.getValue().equals(0)) {
g.setColor(Color.red);
g.fillRect(50,120, 20, 20);
• Con la detección del evento del botón seleccionado en el JComboBox, se llamará también al método ‘pintar’,
que dibujará el botón del ratón seleccionado. En el caso de que sea el botón izquierdo, dibujará desde el píxel
215 del eje ‘x’, que es donde empieza el rectángulo del botón. Si es el botón derecho, se dibujará ese mismo
círculo desde la coordenada ‘x’ de 275 px.
if(combo1.getSelectedItem().toString().equals(“Izquierdo”)) {
g.fillRect(215,120, 60, 60);
g.setColor(Color.gray);
g.fillOval(215,120,60,60);
}
else {
g.fillRect(275,120, 60, 60);
g.setColor(Color.gray);
g.fillOval(275,120,60,60);
}
Desenlace:
Por último, repetimos el proceso con los seis botones restantes, asignándole a cada uno de ellos la nota inglesa
correspondiente (do=C, re=D, mi=E, fa=F, sol=G, la=A, si=B).
El proceso de creación y asociación de eventos se basa en los llamados listeners (escuchadores), que se enlazan a los
componentes «escuchando» si se producen cambios asociados a la integración entre el usuario y la interfaz, y si es
así, se ejecutan las acciones implementadas.
Como hemos visto en las tablas de este tema, debemos diferenciar entre los escuchadores, los métodos que tratan
las acciones y los eventos. Escogiendo la combinación adecuada, podremos desarrollar prácticamente cualquier tipo
de interfaz.
Por último, en este tema también hemos visto la generación y aplicación de pruebas unitarias, imprescindibles para
garantizar la implantación correcta de cualquier tipo de desarrollo.
Ahora que tenemos un diseño bastante avanzado de la base de datos para la tienda de nuestro amigo, nos plantea
una nueva cuestión en con la que podemos ayudarle.
Le gustaría saber cómo gestionar la información de la base de datos, modificando, añadiendo y eliminando elementos
sobre las tablas que la componen (Clientes, Almacén, Empleados…).
En el ámbito de la programación, los eventos están asociados a las acciones que realizan los usuarios para interactuar
con la interfaz o bien a los sucesos que se quieren controlar para dar respuesta a ellos.
Existen múltiples tipos de eventos. Además de hacer clic con el ratón, otros eventos muy utilizados son el movimiento
del ratón y escribir con el teclado.
La implementación de interfaces con Java tiene asociada una funcionalidad que permite detectar diferentes tipos
de eventos. Estos programas pueden detectar desde el tipo de evento (clic, desplazamiento del ratón, pulsación del
teclado…) hasta el componente con el que se ha interactuado (botón, menú desplegable, completar el campo de
un formulario…).
/ 13. Bibliografía
Fernández, A., García-Miguel, B. y García-Miguel, D. (2020). Desarrollo de Interfaces. (1.a ed.). Madrid: Síntesis.