¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrollo informático
  3. Ventana
Extrait - Desarrollo informático Aprenda a diseñar antes de programar
Extractos del libro
Desarrollo informático Aprenda a diseñar antes de programar Volver a la página de compra del libro

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)

images/1_210.png

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:

images/02105a.PNG

Tan pronto como la ventana es visible, podemos agrandarla, moverla, reducirla a un icono…

images/2_210.png

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 y NO:

images/4_210.png

Sabiendo las coordenadas y la dimensión de los botones 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.

images/9_210.png
  • 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

images/10_210.png
  • 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");
   ...