Ventana - Eventos
Objetivos del capítulo
-
Crear aplicaciones gráficas compuestas únicamente por una ventana principal (JFrame).
-
Escuchar eventos.
-
Organizar las diferentes clases de la aplicación grafica.
AWT - SWING
Abstract Window Toolkit (AWT) contiene un gran número de clases que permiten desarrollar una aplicación gráfica.
SWING es una versión más reciente de estas clases. Atención: SWING se añade a AWT. Las clases de SWING heredan de las de AWT. La gestión de los eventos sigue siendo responsabilidad de las clases de AWT.
Java propone otra API gráfica: JavaFX, que forma parte del JDK desde la versión 8 de Java. Gracias a ello, el API Swing no quedó obsoleta. Para el diseño de aplicaciones gráficas y la programación orientada a eventos, Swing es una API perfectamente adaptada.
Definiciones
1. Componente
Un componente (component) es un objeto que tiene una representación grafica. Se puede mostrar en pantalla e interactuar con el usuario. Por ejemplo: una ventana, botones, un scroll, etc.
2. Container
Un contenedor (container) es un componente que puede contener otros componentes (una colección de componentes). Los componentes agregados a un container se enumeran en una lista.
3. JComponent
Es la superclase de la mayor parte de los componentes de SWING. Es una clase abstracta. Para utilizar un componente que hereda de JComponent, hay que ubicarlo en una jerarquía de containers cuya raíz sea un container de «alto nivel», como JFrame, JDialog y JApplet.
Jerarquía de los componentes (extracto)
Las clases de SWING tienen un nombre que comienza por J: JFrame, JButton…
Ventana: creación y visualización
1. Funcionamiento por defecto
La clase JFrame permite crear la ventana principal de una aplicación.
La instanciación de un objeto JFrame no produce ninguna visualización gráfica. Es una creación de objeto, una reserva de espacio en memoria.
import javax.swing.*;
public class Ventana1
{
public static void main(String args[])
{
JFrame miVentana;
miVentana = new JFrame("Primera ventana");
La llamada al método setVisible(true) permite visualizar la ventana. Esta se dibuja en la parte superior izquierda de la pantalla. Contiene algunos elementos, en particular algunos iconos, el logo de Java, con una apariencia (look & feel) que recuerda a la de nuestra plataforma. Para hacer esto, la máquina virtual utiliza los argumentos por defecto, que se pueden modificar.
miVentana.setVisible(true);
}
}
A continuación se muestra el resultado de la ejecución de este programa:
Tan pronto como la ventana es visible, podemos agrandarla, moverla, reducirla a un icono…
Estas posibilidades muestran la existencia de un programa que escucha las acciones del usuario (ratón y teclado) y reacciona en consecuencia....
Eventos
1. Introducción
La noción de evento está relacionada con los cambios de estado de variables.
Cada acción del usuario (teclado o ratón) provoca cambios de estado de registros y variables del sistema operativo. El programa de escucha de los eventos detecta estos cambios.
2. Objetos eventos
a. EventObject, MouseEvent, KeyEvent
Cuando el programa de escucha detecta un evento, crea un objeto para almacenar en él las características. En Java, un evento es un objeto de una clase que hereda de la clase EventObject.
Ejemplos
-
Si el usuario hace clic en un punto de la ventana, se crea un objeto de tipo MouseEvent que contiene las características del clic: posición del ratón, botón utilizado, etc. La clase MouseEvent dispone de todos los métodos necesarios para acceder a estas propiedades.
-
La utilización de las teclas del teclado provoca la creación de eventos de tipo KeyEvent.
MouseEvent y KeyEvent son los eventos básicos.
b. Eventos adaptados a los componentes
La siguiente pantalla presenta dos botones SÍ y NO:
Sabiendo las coordenadas y la dimensión de los botones SÍ y NO, y la posición de un clic del ratón, parece fácil determinar si el clic está dentro o fuera de un botón. Pero la cosa se complica porque Java respeta el marco de trabajo del usuario. Una pantalla no tiene el mismo aspecto según el sistema...
Diseño de programas con escucha de eventos
Los tres ejemplos que siguen ilustran la escucha de eventos WindowEvent.
Las diferentes escrituras permiten la búsqueda de un enfoque de diseño de un programa gráfico con escucha de eventos.
1. Ventana con escucha de los eventos WindowEvent: WindowListener
a. Presentación
La clase Ventana hereda de JFrame. La documentación relativa a JFrame habla de eventos WindowEvent. Vamos a escucharlos...
La clase EscuchaVentana es la clase observador de los eventos WindowEvent.
El método main() de la clase principal (Ventana3) crea el objeto Ventana, crea el objeto Observador, y los asocia.
No siempre es evidente al visualizar los eventos saber con qué acción del usuario se corresponden. No hay nada como una pequeña prueba. Es lo que se hace en la clase EscuchaVentana, situando órdenes de impresión en cada método de la interfaz.
b. Clase principal
public class Ventana3
{
public static void main(String args[])
{
Ventana miVentana;
EscuchaVentana observador;
Creación de la ventana y del observador:
miVentana = new Ventana("Tercera ventana");
observador = new EscuchaVentana();
El observador se asocia a la ventana:
miVentana.addWindowListener(observador);
miVentana.setVisible(true);
}
}
c. Clase Ventana
public class Ventana extends JFrame
{
public Ventana(String titulo)
{
super(titulo);
setBounds(400, 400, 300, 200);
}
}
La clase Ventana hereda de JFrame. Su constructor modifica las coordenadas y el tamaño por defecto de JFrame.
d. Clase EscuchaVentana
public class EscuchaVentana implements WindowListener
{
El método WindowClosing() se llamada cuando el usuario cierra la ventana. La instrucción...
EDT (Event Dispatching Thread)
1. Thread
Un thread designa a una sucesión de instrucciones de un programa, que se ejecutan secuencialmente. Todos los programas Java tienen al menos un thread, llamado main thread (thread principal), creado por la máquina virtual (JVM) al inicio de la aplicación (llamada al método main()).
Todas las aplicaciones realizadas en los capítulos anteriores se ejecutan dentro del thread main.
El lenguaje Java es multithread, lo que significa que la máquina virtual permite que una aplicación tenga varios threads ejecutados en paralelo. La creación de un thread se hace instanciando una clase que implementa la interfaz Runnable.
2. Event Dispatching Thread (EDT)
a. Visualización de los threads de la aplicación
El programa que escucha las acciones del usuario y actúa en consecuencia se ejecuta dentro de un thread llamado EDT: Event Dispatching Thread.
El siguiente programa contiene las instrucciones que permiten mostrar los nombres de los threads donde se ejecutan algunos métodos:
public class Ventana5Threads
{
public static void main(String args[])
{
System.out.println("main(): " + Thread.currentThread().getName());
Ventana miVentana = new Ventana("Ventana5Threads");
}
}
public class Ventana extends JFrame implements WindowListener
{
public Ventana(String titulo) ...
Trabajo práctico: Ratón
1. Objetivo
El objetivo es desarrollar una aplicación que utilice los eventos relacionados con el ratón, usando la documentación de Java.
2. Tema
-
Desplazar la ventana por «draggage», estando el ratón posicionado en la zona de contenido de la ventana.
-
Cambiar el título de la ventana, pulsando en la zona de contenido de la ventana. El título pasa alternativamente de Desplazamiento vertical a Desplazamiento horizontal.
-
Mover la ventana haciendo girar la rueda del ratón, verticalmente si el título de la ventana es Desplazamiento vertical, horizontalmente en caso contrario.
3. Búsqueda de documentación
-
Para la gestión de los eventos de ratón, consultar la documentación de la clase MouseEvent, de las interfaces MouseListener, MouseMotionListener.
-
Para los eventos relacionados con la rueda del ratón, consultar la documentación de la clase MouseWheelEvent y de la interfaz MouseWheelListener.
4. Consejos
-
Para una colección de impresiones por la consola, visualizar los eventos «observados».
-
Declarar el observador de eventos WindowEvent en una clase aparte.
-
Hacer de la clase Ventana su propio observador de eventos MouseEvent y MouseWheelEvent.
5. Ratón: propuesta de corrección
a. Comprobación de los eventos MouseEvent
Este programa de comprobación permite visualizar algunas características de los eventos MouseEvent.
Clase principal
public class VerificaRaton
{
public static void main(String args[])
{
SwingUtilities.invokeLater
(
new Runnable()
{
public void run()
{
Ventana ventana = new Ventana("Eventos de ratón");
...