Interacción con el Usuario Gestión de Eventos 2. 3. 4. Presentación basada en: 1. Como Programar en Java. Deitel y Deitel. Ed. Prentice-Hall. 1988 Java 2., Curso de programación. Fco. Javier Ceballos. Ed. Alfoomega&RA-MA, 2003. Apuntes del Curso Programación Orientado a Objetos. Pablo Castells. Escuela Politécnica Superior, Universidad Autonoma de Madrid. Apuntes del Curso de java. Luis Hernández y Carlos Cervigón. Facultad de Informática. Universidad Católica de Madrid. Introducción Al interactuar con la aplicación, el usuario: Acciona componentes (ActionEvent). El usuario pulsa un botón. El usuario termina de introducir un texto en un campo y presiona Enter. El usuario selecciona un elemento de una lista pulsando el preferido (o de un menú). Pulsa o suelta botones del ratón (MouseEvent). Minimiza, cierra o manipula una ventana (WindowEvent). Escribe con el teclado (KeyEvent). Descubre porciones de ventanas (PaintEvent). 1 Introducción Cuando el usuario de un programa o applet mueve el ratón, presiona un pulsador o pulsa una tecla, genera un evento (actionEvent). Los eventos son objetos de ciertas clases. Normalmente un objeto de alguna subclase de EventObject que indica: El elemento que accionó el usuario. La identificación del evento que indica la naturaleza del evento. La posición del ratón en el momento de la interacción. Teclas adicionales pulsadas por el usuario, como la tecla Control, la tecla de Cambio a mayúsculas, etcétera. Acciones del Usuario Acción Pulsar un botón Objeto origen JButton Tipo de evento ActionEvent Cambio del texto JTextComponent TextEvent Pulsar Intro en un campo de texto JTextField ActionEvent Selección de un nuevo elemento JCombobox ItemEvent, ActionEvent Selección de elemento(s) JList ListSelection-Event Pulsar una casilla de verificación JCheckBox ItemEvent, ActionEvent Pulsar un botón de radio JRadioButton ItemEvent, ActionEvent Selección de una opción de menú JMenuItem ActionEvent Mover la barra de desplazamiento JScrollBar AdjustmentEvent Abrir, cerrar, minimizar, maximizar o cerrar la ventana JWindow WindowEvent ... ... ... 2 Responder a Eventos Para que un componente (applet, ventana, ...) responda a los eventos generados por el usuario sobre ese componente: Se convierte el componente en un oyente (listener) de ciertos eventos generados por él o por otros componentes. Convertir un componente en oyente de un tipo de eventos consiste en implementar la interfaz correspondiente, codificando sus métodos, y agregar el componente a la lista de oyentes de ese tipo de eventos. Ejemplo: Se quiere que la GUI responda a las pulsaciones sobre un botón colocado en la ventana: 1. La ventana (oyente) ha de implementar la interfaz ActionListener 2. El método actionPerformed() de dicha interfaz estará preparado para responder a un evento e. 3. El oyente se añade a la lista de eventos de acción de botón. Responder a Eventos Codigo Ejemplo public class MiGui extends JFrame implements ActionListener { public void MiGui() { (1) ... boton.addActionListener(this); (3) } public void actionPerformed(ActionEvent e) { (2) // Código a ejecutar como respuesta al evento ... } } (1) La ventana (oyente) indica que implementa la interfaz ActionListener (hay otras para diferentes eventos). (2) Se implementa el método ActionPerformed() de la interfaz para responder a un evento e. (3) Se agrega la ventana (oyente) a la lista de oyentes de eventos ActionEvent desde el botón. 3 Ejemplo Al pulsar el botón Copiar, se debe copiar el valor del cuadro "valor“ en el cuadro "Copia". Origen del Evento: Botón Copiar Objeto Evento: ActionEvent e Objeto Oyente: La ventana Responder a eventos class MiGui extends JFrame implements ActionListener { ... public void MiGui(){ // Registro los componentes interesados // en responder a eventos ... componente.addActionListener(this); Este método añade el } oyente especificado (frame) a la lista de ... oyentes para recibir eventos de acción public actionPerformed(ActionEvent e) { (ActionEvent) desde este ... // Aquí se responde el evento componente. } } 4 Responder a eventos En el constructor del frame (oyente), registro el botón y añado el oyente (frame) para recibir eventos de acción desde el botón. botonCopiar. AddActionListerner (this); El usuario pulsa el botón La Ventana ( oyente) El botón crea el objeto ActionEvent() El botón envía el mensaje actionPerfformed() al frame con el argumento ActionEvent. Cada vez que el componente produzca el evento se invocará automáticamente el método actionPerfformed(). El código de este método se ejecutara cada vez que se pulse el botón Otro modelo para responder a eventos Se puede crear un manejador de eventos en dos pasos: 1. Se define una clase específica que haga de oyente de eventos y que implemente el método actionPerfformed() class Mioyente implements ActionListerner { Public void actionPerformed() { código.... 2. Registramos un ejemplar como oyente de componentes: Componente.addActionListerner (ejemplar_de_MiOyente); 5 Otro modelo para responder a eventos class MiGui extends Jframes{ ... public void MiGui{ //Registro los componentes interesados //en responder a eventos... componente.addActionListerner(new MiOyente()); } ... Class Mioyente implements ActionListerner(){ public actionPerformed(ActionEvent e){ .. // Aquí se responde al evento } } Se añade el oyente especificado (ejemplar de MiOyente) a la lista de oyentes para recibir eventos de acción (ActionEvent) desde ese componente. Ejemplo boton con pitido (modelo 1) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gui08 extends JFrame implements ActionListerner(){ Jbutton boton; Container panel; public Gui08(){ super (Ëjemplo de eventos “); panel = this.getContentPanel(); boton = new JButton (“Pulsar”); panel.add(boton); Boton.addActionListerner(this); setSize(100, 100); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { Toolkit.getDefaultTolkit().beep(); } .... 6 Ejemplo Reproducir un valor import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gui10 extends JFrame { Container panel; JButton botonCopiar; JTextField campoValor, resultado; public Gui10() { panel = getContentPane(); panel.setLayout(new FlowLayout()); panel.add(new JLabel("Valor ")); campoValor = new JTextField(5); panel.add(campoValor); botonCopiar = new JButton("Copiar"); panel.add(botonCopiar); botonCopiar.addActionListener(new OyenteBoton()); panel.add(new JLabel(" Copia ")); resultado = new JTextField(6); Ejemplo Reproducir un valor setSize(400, 100); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String args[]) { Gui10 ventana = new Gui10(); } class OyenteBoton implements ActionListener { public void actionPerformed(ActionEvent e){ String valor = campoValor.getText(); resultado.setText(valor); } } } 7 Ejemplo: contador de pulsaciones Una aplicación que muestre el número de pulsaciones que se realizan sobre su botón. public class Gui11 extends JFrame { ... public Gui11() { boton1 = new JButton("PULSA"); label1 = new JLabel("Pulsaciones: 0"); panel = getContentPane(); panel.add(boton1); panel.add(label1); panel.setLayout(new FlowLayout()); boton1.addActionListener(new OyenteBotonPulsaciones()); ... } ... class OyenteBotonPulsaciones implements ActionListener { public void actionPerformed(ActionEvent e){ contador++; label1.setText("Pulsaciones: " + contador); } ... Ejemplo cambio de color import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gui12 extends JFrame { JButton red = new JButton("Rojo"); JButton blue = new JButton("Azul"); Container panel; public Gui12() { super("Color de fondo"); panel = getContentPane(); panel.setLayout(new FlowLayout()); panel.add(red); panel.add(blue); red.addActionListener(new ColorActionListener(Color.red)); blue.addActionListener(new ColorActionListener(Color.blue)); setSize(200, 200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE) ; } ... 8 Ejemplo cambio de color public static void main(String args[]) { Gui12 ventana = new Gui12(); } class ColorActionListener implements ActionListener { Color fondo; public ColorActionListener(Color unColor) { fondo = unColor; } public void actionPerformed(ActionEvent evento) { panel.setBackground(fondo); } } } ActionEvent El objeto ActionEvent ofrece un método getActionCommand() que devuelve un objeto con la información sobre el origen del evento (el botón en nuestro caso). Con un botón, devuelve la etiqueta del botón. Para identificar botones individuales: public void actionPerformed(ActionEvent e) { String s = (String)e.getActionCommand(); if(s.equals("Aceptar")) { // Tratamiento del botón Aceptar } ... 9 ActionEvent El método getSource() indica el objeto en el que se ha originado el evento: public void actionPerformed(ActionEvent e) { if(e.getSource() == lista) { campo1.setText("En la lista."); } else if(e.getSource() == texto) { campo2.setText("En el campo de texto."); } else if(e.getSource() == boton) { campo3.setText("En el botón."); } } Un conversor Euros-pesetas import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gui13 extends JFrame { Container panel; TextField cantidad; JButton boton1, boton2; public Gui13(){ super("Conversor Euros-Pesetas"); boton1 = new JButton("A euros"); boton2 = new JButton("A pesetas"); cantidad = new TextField(10); panel = this.getContentPane(); panel.add(cantidad); panel.add(boton1); panel.add(boton2); panel.setLayout(new FlowLayout()); boton1.addActionListener(new OyenteBoton()); boton2.addActionListener(new OyenteBoton()); setSize(300, 250); 10 Un conversor Euros-pesetas setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String args[]) { Gui13 ventana = new Gui13(); } class OyenteBoton implements ActionListener { public void actionPerformed(ActionEvent ae) { Float f = new Float(cantidad.getText()); float valor = f.floatValue(); String s = ( String)ae.getActionCommand(); if(s.equals("A euros")) { valor = (float) ( valor / 166.321); panel.setBackground(Color.green); } else if (s.equals("A pesetas")) { valor = (float) (valor * 166.321); panel.setBackground(Color.blue); } cantidad.setText(Float.toString(valor)); } } } Interfaces para procesar eventos Para facilitar la tarea del programador se han creado una serie de interfaces que deben implementarse cuando se quieren procesar algunos de estos eventos. Algunas interfaces y sus métodos son: ActionListener Escucha eventos de tipo ActionEvent actionPerformed(ActionEvent) KeyListener Escucha eventos de teclado keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) MouseListener Escucha eventos de acción del ratón (botones) mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) MouseMotionListener Escucha eventos de movimiento del ratón mouseDragged(MouseEvent) mouseMoved(MouseEvent) 11 Ejercicio Escribe un swing que presente la GUI de un teléfono: Botones con los números del 0 al 9. Un campo de texto para mostrar el número marcado. Un botón para colgar el teléfono. 12