Está en la página 1de 14

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

Eventos
Objetivo: Programacin Orientada a Eventos Modelo de Eventos en Java Ejemplos de eventos.

60 minutos
Teora: Exposicin teora bsica.

60 minutos
Ejercicios: Resolucin ejercicios bsicos.

Trabajo en Casa
Ejercicios: Terminar los ejercicios no vistos en clase.

Conexin a Prcticas
Ejercicios: Diferentes ejercicios con los componentes aprendidos.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

1 Programacin Orientada a Eventos


Antes de comenzar con la programacin orientada a eventos vamos a explicar lo qu es un programa dirigido por eventos. Hasta ahora conocemos dos tipos de aplicaciones, aplicaciones en modo consola y aplicaciones grficas. Las aplicaciones en modo consola se ejecutan secuencialmente. Si el usuario interviene, es un paso ms dentro de la secuencia. El programa no continuar hasta que el usuario haya terminado la accin. En las aplicaciones grficas no se sigue este mismo modelo. Como sabemos las aplicaciones grficas pueden ejecutar varios hilos simultneamente para hacer diferentes operaciones a la vez. Pues bien, uno de esos hilos se encarga de gestionar la interaccin con el usuario mediante eventos. Este hilo consulta una cola de eventos que es alimentada por las diferentes acciones que el usuario ejecuta. Estas acciones se modelan como eventos son, por ejemplo, movimientos de ratn, pulsacin sobre teclas, botones, etc. Hay un nmero muy elevado de eventos. Incluso hay eventos que no son generados por el propio usuario. Este comportamiento hace que se puedan tratar las acciones del usuario a la vez que se pueden realizar otro tipo de operaciones. Puesto que las aplicaciones grficas tienen un comportamiento diferente, nosotros como programadores debemos ampliar nuestra forma de programar para adaptarnos a la programacin orientada a eventos. La programacin orientada a eventos, basndose en un marco de trabajo, permite al programador de una forma sencilla centrarse en la programacin de la respuesta a un evento. Por ejemplo, si cuando pulsamos un botn queremos que genere un archivo de texto, a nosotros como programadores nos interesa programar la accin de generar el archivo, siendo en este caso el entorno de ejecucin de Java el que se encargue del retro de trabajos. Para poder dominar la programacin orientada a eventos en Java debemos conocer antes su modelo de eventos.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

2 Modelo de Eventos en Java


En el modelo de programacin de eventos en Java, tenemos los siguientes elementos: 1. Evento (event): Por ejemplo, pulsacin sobre un botn. 2. Fuente de evento (event source): Por ejemp lo, el botn sobre el que se genera la pulsacin. 3. Manejadores de eventos (event listener): Clase que implementar el manejo del evento (lo que se hace en respuesta al evento). Los manejadores de eventos tienen que registrarse en las distintas fuentes de eventos, por ejemplo 1:
buton.addActionListener(manejador)

La fuente de eventos enva objetos de tipo EventObject a todos los manejadores registrados cuando se produce el evento 2. El manejador de eventos utilizar la informacin de EventObject para realizar la accin oportuna. En Java los eventos estn organizados dentro del paquete java.awt.event. La clase java.util.EventObject es la clase base de todos los eventos utilizados en las aplicaciones grficas. Por cada tipo de evento XxxEvent, tenemos u interfaz XxxListener que es la que nos na permite definir los manejadores de eventos. Ejemplos son:
Tipo Evento Interfaz ActionEvent ActionListener KeyEvent KeyListener Tabla 1. Ejemplos de tipos de eventos y su interfaz asociada.

Ejercicio: Busca en el API los mtodos de las interfaces mencionadas en la tabla anterior. Como respuesta al evento tendremos que programar una clase que implemente los mtodos de la interfaz apropiada. Y, qu son los adaptadores? Java para facilitar la implementacin de algunos manejadores de eventos proporciona clases que ya implementan los mtodos de las interfaces en cuestin, permitiendo al programador centrarse exclusivamente en lo que le interesa. Ejemplos de estos adaptadores son: MouseAdapter y WindowAdapter.
Con esta sentencia estamos registrando slo los manejadores para respuestas a acciones. Otros manejadores utilizarn un registro diferente. 2 Ntese como es plural, se indica manejadores por lo que una fuente puede indicar el evento a varios manejadores y una fuente puede registrar varios manejadores (varias llamadas a addActionListener, por ejemplo).
1

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

Si buscamos la clase WindowAdapter en el API obtendremos tendremos informacin sobre sta indicndonos lo siguiente: Responde al tipo de eventos WindowEvent. Implementa la interfaz WindowListener, que tiene los siguientes mtodos: o windowActivated(WindowEvent e) o windowClosed(WindowEvent e) o windowClosing(WindowEvent e) o windowDeactivated(WindowEvent e) o windowDeiconified(WindowEvent e) o windowGainedFocus(WindowEvent e) o windowIconified(WindowEvent e) o windowLostFocus(WindowEvent e) o windowOpened(WindowEvent e) o windowStateChanged(WindowEvent e)

Sera una tarea pesada si cada vez que tuviramos que tratar un evento de una ventana tuviramos que implementar todos los mtodos de la interfaz. Para ello, Java proporciona estos adaptadores. Lo que haramos sera extender de la clase adaptador que ya implementa todos los mtodos de la interfaz y redefinira el mtodo que considerase oportuno. Ejercicio: Investiga como suelen programar los adaptadores los mtodos de las interfaces que implementan.

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

3 Ejercicios Bsicos sobre Eventos


Manejadores implementados en clases no anidadas
import javax.swing.*; import java.awt.*; // No olvidar por los eventos import java.awt.event.*;

/* * Ejemplo de tratamiento de eventos */ class Ventana extends JFrame { /** Boton sobre el que aplicamos el evento */ JButton boton; /** No olvidar la llamada a super */ Ventana(String titulo) { super(titulo); boton = new JButton("Pulsame"); this.getContentPane().add(boton); // Tramtamiento para cerrar la ventana this.addWindowListener(new ManejadorVentana()); // Asignamos manejador al boton boton.addActionListener(new Manejador()); } /** Visualizacin de la ventana */ void visualizar() { this.pack(); this.setVisible(true); } } // Prueba

import java.awt.*; import java.awt.event.*; public class Manejador implements ActionListener { Manejador() { System.out.println("Manejador..."); } public void actionPerformed(ActionEvent e) { System.out.println("Accion"); } }

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

import import // Nol import

javax.swing.*; java.awt.*; olvidar por los eventos java.awt.event.*;

/* * Manejador para la ventana. * Heredamos porque java ya nos ofrece un manejador. */ public class ManejadorVentana extends WindowAdapter { /** Acciones al cerrar */ public void windowClosing(WindowEvent e) { System.exit(0); } }

Ejemplo WindowAdapter, ActionListener, MouseAdapter


import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * Ejemplo de eventos en swing. * * @author UC3M - Dpto. Ingeniera Telemtica. * @version 1.0 */ class Ventana extends JFrame { private static int MAX_FILAS = 3; private static int MAX_COLUMNAS = 3; /** Matriz de botones. */ JButton [][] botones; /** No olvidar llamada al constructor */ Ventana(String titulo) { super(titulo); // Doy tamao. botones = new JButton[MAX_FILAS][MAX_COLUMNAS]; // Creo los botones for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) botones[filas][columnas] = new JButton(filas + "," + columnas); // Asocio el layout al getContentPane this.getContentPane().setLayout(new GridLayout(MAX_FILAS,MAX_COLUMNAS)); // Agrego los botones al panel for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) this.getContentPane().add(botones[filas][columnas]); this.addWindowListener(new MiAdaptadorVentana()); MiManejadorAccion al = new MiManejadorAccion(); botones[0][0].addActionListener(al);

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
MiAdapadorRaton mr = new MiAdapadorRaton(); // Se lo agrego a todos for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) { botones[filas][columnas].addActionListener(al); botones[filas][columnas].addMouseListener(mr); } }

public void mostrar(int ancho, int alto) { this.pack(); this.setSize(ancho,alto); this.setVisible(true); } } // Ventana

/** Mi adaptador particular de ventana para hacer un cierre limpio */ class MiAdaptadorVentana extends WindowAdapter { public void windowClosing(WindowEvent e) { System.out.println("Cerrando ventana de forma limpia..."); System.exit(0); } } // MiAdaptardorVentana

/** Mi manejador de acciones */ class MiManejadorAccion implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Se ha ejecutado una accion"); JButton botonPulsado = (JButton)e.getSource(); System.out.println(botonPulsado.getText()); } } // MiManejadorAccio

/** Adaptador de ratn */ class MiAdapadorRaton extends MouseAdapter { public void mouseClicked(MouseEvent e) { System.out.println("Mouse clicked.."); } } // MiAdaptadorRaton

/** * Prueba de clase */ public class Eventos { public static void main(String [] args) { Ventana ventana = new Ventana("Ejemplo Eventos"); ventana.mostrar(200,200); } } // Eventos

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

WindowAdapter como clase Annima


import java.awt.*; import java.awt.event.*; import javax.swing.*;

/** * * Ejemplo de eventos en swing. * * @author UC3M - Dpto. Ingeniera Telemtica. * @version 1.0 */ class Ventana extends JFrame { private static int MAX_FILAS = 3; private static int MAX_COLUMNAS = 3; /** Matriz de botones. */ JButton [][] botones; /** No olvidar llamada al constructor */ Ventana(String titulo) { super(titulo); // Doy tamao. botones = new JButton[MAX_FILAS][MAX_COLUMNAS]; // Creo los botones for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) botones[filas][columnas] = new JButton(filas + "," + columnas); // Asocio el layout al getContentPane this.getContentPane().setLayout(new GridLayout(MAX_FILAS,MAX_COLUMNAS)); // Agrego los botones al panel for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) this.getContentPane().add(botones[filas][columnas]);

MiManejadorAccion al = new MiManejadorAccion(); botones[0][0].addActionListener(al); MiAdapadorRaton mr = new MiAdapadorRaton(); // Se lo agrego a todos for (int filas =0;filas<MAX_FILAS;filas++) for (int columnas=0;columnas<MAX_COLUMNAS;columnas++) { botones[filas][columnas].addActionListener(al); botones[filas][columnas].addMouseListener(mr); } // Lo estoy haciendo como clase annima. //this.addWindowListener(new MiAdaptadorVentana()); this.addWindowListener( new WindowAdapter() { public void windowClsing(WindowEvent e) { System.exit(0); } }

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
);

} public void mostrar(int ancho, int alto) { this.pack(); this.setSize(ancho,alto); this.setVisible(true); } } // Ventana /** Mi adaptador particular de ventana para hacer un cierre limpio */ /* Comentamos este cdigo porque lo hemos creado antes como clase annima */ class MiAdaptadorVentana extends WindowAdapter { public void windowClosing(WindowEvent e) { System.out.println("Cerrando ventana de forma limpia..."); System.exit(0); } } // MiAdaptardorVentana */

/** Mi manejador de acciones */ class MiManejadorAccion implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Se ha ejecutado una accion"); JButton botonPulsado = (JButton)e.getSource(); System.out.println(botonPulsado.getText()); } } // MiManejadorAccio /** Adaptador de ratn */ class MiAdapadorRaton extends MouseAdapter { public void mouseClicked(MouseEvent e) { System.out.println("Mouse clicked.."); } } // MiAdaptadorRaton

/** * Prueba de clase */ public class Eventos { public static void main(String [] args) { Ventana ventana = new Ventana("Ejemplo Eventos"); ventana.mostrar(200,200); } } // Eventos

Jorge Ruiz Magaa

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

KeyListener e implementacin de interfaz en la misma clase


import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * Ejemplo Utilizacin del teclado * @author Dpto. Igeniera Telemtica. Universidad Carlos III de Madrid */ class EjemploKeyListener extends JFrame implements KeyListener { EjemploKeyListener(String titulo) { super(titulo); // Aadimos el escuchador de teclado a nuestra ventana this.addKeyListener(this); } public void mostrar() { this.setVisible(true); } /* Implementamos los mtodos del interfaz KeyListener */ /* El interfaz tiene tres mtodos que hay que redefinir */ /* A continuacin se da un ejemplo de los tres */ // Mtodo llamado cuando se pulsa una tecla. Primero en ejecutarse public void keyPressed(KeyEvent e) { System.out.println("Tecla Presionada"); // Ejemplos de pulsaciones de teclas switch (e.getKeyCode()) { KeyEvent.VK_DOWN : System.out.println("PULSADA: break; KeyEvent.VK_UP : System.out.println("PULSADA: break; KeyEvent.VK_LEFT : System.out.println("PULSADA: break; KeyEvent.VK_RIGHT : System.out.println("PULSADA: break;

case

ABAJO");

case case case }

ARRIBA"); IZQUIERDA"); DERECHA");

/* El resto de teclas las puedes ver consultando la documentacin de KeyEvent en http://java.sun.com/j2se/1.5.0/docs/api/java/awt/event/KeyEvent.html */ } // Mtodo llamado cuando se pulsa contnuamente una tecla. Segundo en ejecutarse public void keyTyped(KeyEvent e) { System.out.println("Tecla contnuamente pulsada"); // Nos aseguramos de que el evento no es consumido por nadie ms. e.consume(); } // Mtodo llamado cuando se suelta una tecla. Tercero en ejecutarse public void keyReleased(KeyEvent e) { System.out.println("Tecla Soltada"); e.consume();

Jorge Ruiz Magaa

10

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
} /* Fin de la implementacin de los mtodos de la interfaz KeyListener */ public static void main(String args[]) { EjemploKeyListener eKL = new EjemploKeyListener("Ejemplo KeyListener"); eKL.mostrar(); }

} // EjemploKeyListener

Manejador Eventos como clase anidada y tratamiento con getSource


import import import import javax.swing.*; //importacion de los componentes graficos java.awt.*; java.lang.Object.*; java.awt.event.*; /**Clase que implementa una ventana principal *que contiene una etiqueta y 3 botones */ public class Botones extends JFrame { JLabel etiqueta; //etiqueta JButton [] botones; //botones de iteracion JPanel panel; //Metodos intermedios private void creaccion () { botones = new JButton[3]; etiqueta = new JLabel ("Conjunto de Botones"); etiqueta.setBounds(new Rectangle(200, 200, 100, 30)); etiqueta.setFont(new Font("Arial",Font.ITALIC,20)); botones[0] = new JButton("Jorgito"); botones[0].setBackground (Color.red); botones[0].setBounds(new Rectangle(10, 10, 100, 30)); botones[1] = new JButton("Juanito"); botones[1].setBackground (Color.yellow); botones[1].setBounds(new Rectangle(100, 100, 100, 30)); botones[2] = new JButton("Jaimito"); botones[2].setBackground (Color.orange); botones[2].setBounds(new Rectangle(50, 50, 100, 30)); //botones[2].setName("botones[2]"); panel = new JPanel (); int i,j; //if((i==1&&0<j&&j<8)||(i==2&&j==9)||(i==3&&j==5)||(i==4&&j==1)|| // (i==5&&3<j&&j<7)||(i==5&&j==9)){ i = 3; j=4; if ((i==1&&0<j)) { ; }

private void agregar () {

Jorge Ruiz Magaa

11

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
panel.setLayout(null); //getContentPane().setLayout(null); panel.add (etiqueta); panel.add (botones[0]); panel.add (botones[1]); panel.add (botones[2]); } private void visualizar () { panel.setBackground(Color.red); getContentPane().add(panel); } //Constructor public Botones (String titulo) { super(titulo); creaccion(); agregar(); visualizar(); Manejador manejador = new Manejador(); botones[1].addActionListener(manejador); botones[2].addActionListener (manejador); }

//Metodo principal de la clase Botones public static void main (String [] args) { //Se crea un objeto de tipo Botones Botones ventana = new Botones ("Botones Swing"); //Distintas caracteristicas de la ventana ventana.pack(); ventana.setSize (500, 500); ventana.setVisible(true); ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); aplicacion } class Manejador implements ActionListener { public void actionPerformed (ActionEvent e) { System.out.println(e.getSource()); if (e.getSource() == botones[1]) { panel.setBackground(Color.green); }else if (e.getSource() == botones[2]) { panel.setBackground(Color.white); } } } }

//Metodo

para

cerrar

Jorge Ruiz Magaa

12

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales

4 Timer
Un timer es un objeto que permite generar un evento con una frecuencia que nosotros determinemos. Con la respuesta a este evento nosotros podremos implementar la lgica adecuada a nuestras necesidades, por ejemplo, podemos utilizar un objeto de la clase Timer para actualizar el tiempo en pantalla cada segundo para mostrar el tiempo transcurrido al visualizar un video. Los pasos para utilizar un timer son los siguientes: 1. Crear un objeto de la clase Timer indicndole la frecuencia en milisegundos con la que debe generar los eventos. 2. Programar la respuesta al evento, implementando la interfaz ActionListener. 3. Ligar al timer el manejador de eventos. 4. Utilizar el mtodo start() del timer para arrancar la generacin de eventos. 5. Utilizar el mtodo stopt() del timer para parar la generacin de eventos. A continuacin se muestra u ejemplo sencillo de utilizacin de un timer para indicar al n usuario que han pasado 60 segundos.
import java.awt.event.*; import java.awt.*; import javax.swing.*;

/** * Ejemplo sencillo de utilizacin del timer. */ class Reloj extends JFrame implements ActionListener { Timer timer; int segundos; // Constructor del objeto Reloj() { super("Prueba de Reloj"); segundos = 0; // Crea,mos el timer y le decimos que genere un evento cada segundo // 1000 milisegundos. Asignamos el manejador del evento al propio // objeto que es el que implementa el interfaz ActionListener timer = new Timer(1000, this); // Arrancamos el timer. timer.start(); } // Mtodo que realiza la accin cuando salta un evento del timer. public void actionPerformed(ActionEvent e) { System.out.println("Han pasado " + segundos + " segundos."); // Paramos el timer a los 60 segundos. if (segundos == 60) timer.stop(); segundos++; } // Mostramos la ventana. public void mostrar() { this.setVisible(true); } // Ejecucin public static void main(String args[])

Jorge Ruiz Magaa

13

Universidad Carlos III de Madrid Departamento de Ingeniera Telemtica Organizacin de Contenidos Audiovisuales
{ Reloj reloj = new Reloj(); reloj.mostrar(); } } // JFrame

Ejercicio: Se te ocurre como simular un bucle con el empleo de un timer?

Jorge Ruiz Magaa

14