Upload
trantu
View
240
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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); }
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
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
13/04/2007
22
Resumen de Listeners
13/04/2007 DAI
Resumen de Interfaces de Eventos(II)
13/04/2007 DAI
13/04/2007
23
Resumen de Interfaces de Eventos(III)
13/04/2007 DAI
Resumen de Interfaces de Eventos(IV)
13/04/2007 DAI
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