eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf ·...

24
13/04/2007 1 GESTIÓN DE EVENTOS GUI EN JAVA 13/04/2007 DAI Conceptos básicos z Evento: Objeto que describe qué sucede z Generador de evento (event source). Ej: pulsación de botónÎ genera ActionEvent: getActionCommand(): comando asociado a la acción getModifiers(): modificadores capturados durante la getModifiers(): modificadores capturados durante la acción z Gestor de evento (event handler): Método que recibe un objeto Evento z Modelo de eventos Java 2: Modelo de delegación 13/04/2007 DAI

Transcript of eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf ·...

Page 1: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

1

GESTIÓN DE EVENTOS GUI EN JAVA

13/04/2007 DAI

Conceptos básicos

Evento: Objeto que describe qué sucede

Generador de evento (event source). Ej: pulsación de botón genera ActionEvent:– getActionCommand(): comando asociado a la acción– getModifiers(): modificadores capturados durante la– getModifiers(): modificadores capturados durante la

acciónGestor de evento (event handler): Método que recibe un objeto EventoModelo de eventos Java 2: Modelo de delegación

13/04/2007 DAI

Page 2: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

2

Modelo de delegación de eventos

Origen JDK1.1

Los eventos se envían al componente que los origina

Cada componente debe tener registradas las clases listeners que contienen los gestores de eventos Separación objeto-gestor de eventos

Los eventos se envían a los listeners

Cada evento tiene un interfaz de escucha– Métodos a definir para recibir y tratar el evento

13/04/2007 DAI

Gestión de Eventos

13/04/2007 DAI

Page 3: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

3

13/04/2007 DAI

Consideraciones de diseño

Ejecución rápida al ejecutarse en el mismo thread ejecutar en otro thread si la acción va a requerir tiempo aspectos de concurrencia en Swing¿Uso de clases diferentes para tipos ¿ p pdiferentes de listeners?– Simplicidad de mantenimiento vs rendimiento

Listeners en clases públicas o privadas

13/04/2007 DAI

Page 4: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

4

Objetos de Evento (EventObject)

Cada método de listener tiene como argumento un objeto que hereda de java.util.EventObject(ActionEvent, ItemEvent,…)

Object getSource() : obtenemos el objeto que disparó el evento

13/04/2007 DAI

AWTEvent

Clase raíz para los objetos de evento AWT

13/04/2007 DAI

Page 5: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

5

Tipos de eventos

Bajo nivel– Eventos de ventana, de ratón, de

teclado..generalmente entradas de usuario

Semánticos– A veces activados por entradas de usuario– A veces activados por entradas de usuario– Eventos disparados por la inserción de datos,

selección de item en lista o combo, etc– Son los que más deben preocuparnos para tener un

código robusto y portable

13/04/2007 DAI

Adaptadores de eventos (Adapter)

Algunos interfaces contienen más de 1 método Tenemos que implementarlos todos, aun cuando no queramos hacer nada con ellos cuerpo vacío

Ejemplo:MouseListener – mousePressed, mouseReleased, mouseEntered,

mouseExited, mouseClicked.

13/04/2007 DAI

Page 6: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

6

Clases internas

Cómo usar una clase adaptadora sin tener que heredar Puede ser necesario al no existir herencia múltiple en JavaSolución 1: Clase adaptadora interna

public class MyClass extends Applet {... someObject.addMouseListener(new MyAdapter()); ... class MyAdapter extends MouseAdapter {

public void mouseClicked(MouseEvent e) {.. } }

}13/04/2007 DAI

Clases internas anónimas

Es la solución 2

public class MyClass extends Applet { ...

someObject.addMouseListener(new MouseAdapter() { bli id Cli k d(M E )public void mouseClicked(MouseEvent e)

{ …... } });

... } }

13/04/2007 DAI

Page 7: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

7

Peligros de clases internas y anónimas

Internas: – El tiempo de carga de la aplicación y el uso de

memoria es directamente proporcional al número de clases usadas.

– Si no se declara como clase static, tiene acceso a i bl d i t i fi l i d d l lvariables de instancia final privadas de la clase

contenedoraAnónimas: El mecanismo de persistencia no las considera

13/04/2007 DAI

El manejador de eventos

A partir de JDK1.4 se introduce la clase EventHandler para soportar event listeners muy simples

Utilidad:– Crear event listener persistente sin tener que incluirlos en

una clase propiaR di i t “ ñ d ” t l– Rendimiento, ya que no “añade” otra clase

Dificultad de construcción: errores no se detectan en tiempo de compilación

13/04/2007 DAI

Page 8: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

8

Ejemplo de manejador de eventos

import java.beans.EventHandler;public class ColorChooserDemo extends JPanel { ... tcc.getSelectionModel().addChangeListener( (ChangeListener)

EventHandler.create( ChangeListener.class, banner, "foreground", "source.selectedColor")); )

... ... }

13/04/2007 DAI

Listeners soportados por componentes

Component listener: Cambios en tamaño, posición o visibilidad

Focus listener: Escucha si el componente está en disposición de recibir entrada de teclado

Key listener: Escucha pulsaciones de teclas; únicamente si el componente es el foco actual

Mouse listener: Clics de ratón y entrada/salida del área del componente

Mouse-motion listener: Cambios en la posición del ratón en la superficie del componente

Mouse-wheel listener (a partir de 1.4): Movimiento de la rueda del ratón por el componente

13/04/2007 DAI

Page 9: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

9

Interfaz ActionListener

Sirve para detectar ActionEventEjemplos:Pulsar botón, pulsar return en JTextArea¿Cómo detectamos el evento?

Public void actionPerformed(ActionEvent e)Public void actionPerformed(ActionEvent e)

¿Cómo situamos un objeto a la escucha de este evento?– Public addActionListener(ActionListener)

13/04/2007 DAI

ActionEvent

Evento semántico que hereda de Java.awt.AWTEvent, indica que ha ocurrido una acción en un componente

13/04/2007 DAI

Page 10: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

10

Ejemplo ActionListener

13/04/2007 DAI

Interfaz ItemListener

Escuchar eventos ItemEvent producidos por JCheckbox, JList, JCheckBoxMenuItemMétodo a implementar:– Public void itemStateChanged(ItemEvent e)

Añadir objeto a escucha:Añadir objeto a escucha:– Public addItemListener(ItemListener)

13/04/2007 DAI

Page 11: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

11

ItemEvent

Evento semántico que indica que se ha seleccionado un objeto, hereda de AWTEvent

13/04/2007 DAI

Ejemplo ItemListener

public class ComponentEventDemo extends JPanel implements ComponentListener, ItemListener

{..JCheckBox checkbox = new JCheckBox("Label visible", true); checkbox.addItemListener(this);..public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED){ if (e.getStateChange() ItemEvent.SELECTED)

{ label.setVisible(true); label.revalidate(); label.repaint();

} else { label.setVisible(false); }

}

13/04/2007 DAI

Page 12: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

12

ComponentListener

Generado por JDialog y Jframe para ComponentEvent

13/04/2007 DAI

ComponentEvent

Evento de bajo nivel que indica cambio en tamaño, posición, visibilidad en componente

13/04/2007 DAI

Page 13: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

13

Ejemplo ComponentListener

public class ComponentEventDemo ... implements ComponentListener{……public void componentHidden(ComponentEvent e){ displayMessage("componentHidden event from " + e.getComponent().getClass().getName()); }

public void componentMoved(ComponentEvent e) { Component c = e.getComponent(); displayMessage("componentMoved event from " + c.getClass().getName() + "; new location: " +

c.getLocation().x + ", " + c.getLocation().y); }

public void componentResized(ComponentEvent e) { Component c = e.getComponent(); displayMessage("componentResized event from " + c.getClass().getName() + "; new size: " + c.getSize().width

+ ", " + c.getSize().height); }

public void componentShown(ComponentEvent e) { displayMessage("componentShown event from " + e.getComponent().getClass().getName()); }….}

13/04/2007 DAI

Window Listener

Para manejar WindowEvent, producidos por JDialog y JFramePublic void addWindowListener(WindowListener e)Métodos a implementar

13/04/2007 DAI

Page 14: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

14

WindowEvent

Evento de bajo nivel que indica cambio en estado de ventana, que hereda de ComponentEvent

13/04/2007 DAI

Ejemplo WindowListener

public WindowEventDemo() { ... frame.addWindowListener(this);

frame.addWindowFocusListener(this); frame.addWindowStateListener(this);}public void windowClosing(WindowEvent e) {

displayMessage(“windowClosing."); ActionListener task = new ActionListener() {

boolean alreadyDisposed = false;boolean alreadyDisposed = false; public void actionPerformed(ActionEvent e) {

if (!alreadyDisposed) { alreadyDisposed = true; frame.dispose(); } else { //make sure the program exits System.exit(0); }

} }; Timer timer = new Timer(500, task); timer.setInitialDelay(2000); timer.start();

} 13/04/2007 DAI

Page 15: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

15

Interfaz MouseListener

MouseEvent generado por Canvas, JDialog, JFrame, JPanel y JWindow

13/04/2007 DAI

MouseEvent

Indica la ocurrencia de una acción de ratónHereda de InputEvent(ComponentEvent)Evento de bajo nivel generado por– Acciones de ratón (MouseEvent)

Acciones sobre botonesAcciones sobre botonesPosicionamiento del ratón sobre componentes

– Acciones de movimiento de ratón (MouseMotionEvent)

Desplazar/arrastrar el ratón

13/04/2007 DAI

Page 16: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

16

MouseEvent

13/04/2007 DAI

Ejemplo MouseListener

public class MouseEventDemo ... implements MouseListener { blankArea.addMouseListener(this); addMouseListener(this); ... public void mousePressed(MouseEvent e) { saySomething("Mouse pressed; # of clicks: " + e.getClickCount(), e); }

public void mouseReleased(MouseEvent e) { saySomething("Mouse released; # of clicks: " + e.getClickCount(), e); }

public void mouseEntered(MouseEvent e) { saySomething("Mouse entered", e); }

public void mouseExited(MouseEvent e) { saySomething("Mouse exited", e); }

public void mouseClicked(MouseEvent e) { saySomething("Mouse clicked (# of clicks: " + e.getClickCount() + ")", e); }

void saySomething(String eventDescription, MouseEvent e) { textArea.append(eventDescription + " detected on " + e.getComponent().getClass().getName() + "." + newline);

} } 13/04/2007 DAI

Page 17: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

17

MouseMotionListener

Canvas, JDialog, JFrame, JPanel, JWindow

13/04/2007 DAI

MouseWheelEvent

Hereda de MouseEvent, indicando rotación en la rueda del ratón

13/04/2007 DAI

Page 18: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

18

MouseWheelListener

public class MouseWheelEventDemo ... implements MouseWheelListener ... { public MouseWheelEventDemo() { textArea.addMouseWheelListener(this); ... } public void mouseWheelMoved(MouseWheelEvent e) { String message; int notches = e.getWheelRotation(); if (notches < 0) { message = "Mouse wheel moved UP " + -notches + " notch(es)" + newline; } else { message = "Mouse wheel moved DOWN " + notches + " notch(es)" + newline; } if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { message += " Scroll type: WHEEL_UNIT_SCROLL" + newline; message += " Scroll amount: " + e.getScrollAmount() + " unit increments per notch" + newline; message += " Units to scroll: " +

e.getUnitsToScroll() + " unit increments" + newline; message += " Vertical unit increment: " + scrollPane.getVerticalScrollBar().getUnitIncrement(1) + " pixels" + newline; }

else { message += " Scroll type: WHEEL_BLOCK_SCROLL" + newline; message += " Vertical block increment: " +

scrollPane.getVerticalScrollBar().getBlockIncrement(1) + " pixels" + newline; } saySomething(message, e); } ... }

13/04/2007 DAI

FocusListener

Se produce FocusEvent cuando un componente recibe el foco, es decir, es el componente “activo”

13/04/2007 DAI

Page 19: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

19

FocusEvent

Evento de bajo nivel que indica que un componente recibe el foco de la aplicación

13/04/2007 DAI

Ejemplo FocusListener

public class FocusEventDemo ... implements FocusListener

public void focusGained(FocusEvent e) { displayMessage("Focus gained", e); }

13/04/2007 DAI

public void focusLost(FocusEvent e) { displayMessage("Focus lost", e); }

Page 20: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

20

KeyListener

Permite tratar los eventos gestionados por pulsación de tecla(s) KeyEvent¿Qué podemos detectar?

– Pulsación (key-typed)– Presionar (key-pressed) y soltar una tecla (key-released)

única forma de detectar la pulsación de teclas que no generan carácter Unicode (p ej Fx ctrl etc)generan carácter Unicode (p.ej. Fx, ctrl,etc)

13/04/2007 DAI

KeyEvent

Evento de bajo nivel generado por componente al pulsar, presionar o soltar una tecla. Hereda de InputEvent

13/04/2007 DAI

Page 21: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

21

KeyEvent (II)

13/04/2007 DAI

Ejemplo KeyListener

public class KeyEventDemo ... implements KeyListener ... {public void keyTyped(KeyEvent e) { displayInfo(e, "KEY TYPED: "); }

public void keyPressed(KeyEvent e) { displayInfo(e, "KEY PRESSED: "); }

public void keyReleased(KeyEvent e) { int id = e.getID(); if (id == KeyEvent.KEY_TYPED)

{ char c = e.getKeyChar(); keyString = "key character = '" + c + "'"; }

else { int keyCode = e.getKeyCode(); keyString = "key code = " + keyCode + " (" + KeyEvent.getKeyText(keyCode) + ")"; }} ...

13/04/2007 DAI

Page 22: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

22

Resumen de Listeners

13/04/2007 DAI

Resumen de Interfaces de Eventos(II)

13/04/2007 DAI

Page 23: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

23

Resumen de Interfaces de Eventos(III)

13/04/2007 DAI

Resumen de Interfaces de Eventos(IV)

13/04/2007 DAI

Page 24: eventos.ppt [Modo de compatibilidad] - dis.um.esdis.um.es/~jfernand/0607/dai/eventos.pdf · 13/04/2007 2 Modelo de delegación de eventos zOrigen JDK1.1 zLos eventos se envían al

13/04/2007

24

Manejo de múltiples Listeners

Múltiples listeners pueden estar a la escucha de un mismo eventode un mismo evento

Cada listener recibiría el evento y el objeto que lo produce y actuaría en consecuencia

13/04/2007 DAI

Ejemplo de múltiples listeners

public class MultiListener ... implements ActionListener { ... ………

button1.addActionListener(this); button2.addActionListener(this); button2.addActionListener(new Eavesdropper(bottomTextArea)); }

public void actionPerformed(ActionEvent e) { topTextArea.append(e.getActionCommand() + newline); } }} }

class Eavesdropper implements ActionListener { ...public void actionPerformed(ActionEvent e) {

myTextArea.append(e.getActionCommand() + newline); } }

13/04/2007 DAI