Introducción a la Programación Orientada a Objetos OBJETOS Y EVENTOS INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS GUI Objetos y Eventos Dr. Luciano H. Tamargo http://cs.uns.edu.ar/~lt Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca 2016 • Cada componente de una GUI está asociada a un objeto gráfico de alguna subclase de Component. 01100 10011 10110 01110 01100 10011 10110 01110 1001 1 11 0 0 1 • Un objeto fuente del evento, está asociado a una componente reactiva de la GUI, puede percibir un evento externo provocado por una acción del usuario0 y1 1 0 0 10011 reaccionar disparando un evento interno. 10110 • Un objeto evento se crea implícitamente, asociado a0 1 1 1 0 01100 un evento interno disparado por un objeto fuente del1 0 0 1 1 evento. 10110 • Un objeto oyente (listener) se registra a un objeto 01 10 10 11 0 fuente de evento para responder a la acción del usuario 1 11 0 0 sobre una componente de la GUI. 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 OBJETOS Y EVENTOS El usuario realiza una acción sobre una componente reactiva que genera un evento externo • La clase de un objeto fuente de evento determina las clases de los objetos evento que se crearán implícitamente: Evento Interno Evento Externo percibe dispara OBJETO FUENTE Component crea OBJETO EVENTO EventObject El objeto fuente de evento asociado a la componente reactiva dispara un evento interno creando objetos de alguna subclase de EventObject Introducción a la Programación Orientada a Objetos IPOO - 2016 3 OBJETOS Y EVENTOS 01110 01100 10011 10110 01110 1001 1 11 0 0 1 Profesor Luciano H. Tamargo Clase de los objetos Fuente de evento Clases de los objetos evento JButton ActionEvent JCheckBox ActionEvent, ItemEvent JRadioButton ActionEvent, ItemEvent JMenuItem ActionEvent JTextField ActionEvent, KeyEvent JComboBox ActionEvent, ItemEvent Introducción a la Programación Orientada a Objetos IPOO - 2016 01100 10011 10110 01110 01100 10011 10110 01110 1001 1 11 0 0 1 4 OBJETOS Y EVENTOS • Cada subclase de EventObject define atributos y métodos adecuados para un tipo particular de acción del usuario, como por ejemplo, mover el mouse sobre un panel, oprimir una tecla o activar un botón. 01100 • En cada uno de estos casos se creará un objeto evento 10011 de una clase específica. 10110 Introducción a la Programación Orientada a Objetos IPOO - 2016 2 5 • Los objetos de las clases JButton, JTextField, JComboBox son objetos fuente de evento que crean objetos evento de clase ActionEvent. • Esto es, cuando el usuario realiza una acción sobre la componente asociada al objeto fuente de evento, este 0 1 1 0 0 10011 crea un objeto de clase ActionEvent. 10110 • La clase del objeto oyente que escuche estos eventos0 1 1 1 0 deben implementar la interface ActionListener del 01 10 10 01 01 paquete java.awt.event. 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 6 1 Introducción a la Programación Orientada a Objetos OBJETOS Y EVENTOS El objeto oyente es instancia de una clase que implementa una interface y redefine el método manejador del evento Evento Interno Evento Externo percibe dispara OBJETO FUENTE Component crea OBJETO EVENTO EventObject OBJETO Oyente ActionListener • La clase del oyente implementa a una interface redefiniendo al método manejador del evento de acuerdo al comportamiento esperado en respuesta a la acción del usuario. • El manejador del evento recibe como parámetro a un0 1 1 0 0 10011 objeto evento creado implícitamente. 10110 • Cuando un objeto fuente de evento dispara un evento 0 1 1 1 0 01100 interno, crea objetos evento de alguna subclase de 10011 EventObject provista en el paquete 10110 01110 java.awt.event. 1001 1 11 0 0 1 registrado a El objeto evento es un parámetro para el método manejador del Introducción a la Programación Orientada a Objetos evento IPOO - 2016 7 OBJETOS Y EVENTOS 8 OBJETOS Y EVENTOS • La interface define uno o más métodos manejadores que deben ser implementados considerando el comportamiento esperado en respuesta a la acción del usuario. 01100 • La lista de parámetros de un manejador de eventos 10011 siempre consiste en un argumento del tipo de clase 10110 evento. 01110 01100 10011 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 Introducción a la Programación Orientada a Objetos IPOO - 2016 9 Objeto Evento Interface de oyente Manejador ActionEvent ActionListener actionPerformed(ActionEvent) ItemEvent ItemListener itemStateChanged(ItemEvent) MouseEvent MouseListener mousePressed(MouseEvent) 01100 10011 mouseReleased(MouseEvent) mouseEntered(MouseEvent) 1 0 1 1 0 mouseExited(MouseEvent) 0 1 1 1 0 01100 KeyEvent KeyListener mouseClicked(MouseEvent) 1 0 0 1 1 10110 keyPressed(KeyEvent) keyRealesed(KeyEvent) keyTyped(KeyEvent) Introducción a la Programación Orientada a Objetos IPOO - 2016 • Mostrar una ventana con un panel que cambiará de color según los diferentes eventos del mouse que se produzcan como consecuencia de las acciones del usuario. import import import public java.awt.*; java.awt.event.*; javax.swing.*; class ControlMouse extends JFrame{ 01100 • En otro panel se muestra la acción del usuario y 1la 0011 posición del indicador del mouse sobre la componente.1 0 1 1 0 01110 01100 10011 10110 01110 1001 1 11 0 0 1 Profesor Luciano H. Tamargo 10 EVENTOS DEL MOUSE OBJETOS Y EVENTOS Introducción a la Programación Orientada a Objetos IPOO - 2016 01110 1001 1 11 0 0 1 11 private JPanel panelMouse; private JLabel eventoMouse; private Container contenedor; Introducción a la Programación Orientada a Objetos IPOO - 2016 01100 10011 10110 01110 01100 10011 10110 01110 1001 1 11 0 0 1 12 2 Introducción a la Programación Orientada a Objetos EVENTOS DEL MOUSE EVENTOS DEL MOUSE public ControlMouse() { contenedor = getContentPane(); contenedor.setLayout(new GridLayout(2,0)); public ControlMouse() { panelMouse = new JPanel(); panelMouse.setBackground(Color.WHITE); panelMouse.setPreferredSize (new java.awt.Dimension(300, 150)); eventoMouse = new JLabel(); eventoMouse.setPreferredSize (new java.awt.Dimension(300,70)); … } … 01100 10011 10110 01110 01100 10011 10110 01110 1001 1 11 0 0 1 OyenteMouse escuchaMouse = new OyenteMouse(); 01100 panelMouse.addMouseListener(escuchaMouse);1 0 0 1 1 contenedor.add(panelMouse); contenedor.add(eventoMouse); } 10110 01110 01100 10011 10110 01110 1001 al panel, 1de1 1 0 0 del mouse 1 • Observemos que el oyente queda registrado modo que reaccionará ante los eventos producidos ante las acciones del usuario sobre el panel. 13 14 EVENTOS DEL MOUSE EVENTOS DEL MOUSE class OyenteMouse implements MouseListener{ class OyenteMouse implements MouseListener{ … public void mouseEntered (MouseEvent e) { String s = new String(); eventoMouse.setText(s.format 01100 (“Entró en[%d,%d]", 1 0 0 1 1 10110 e.getX(), e.getY())); 01110 panelMouse.setBackground(Color.RED); 01100 10011 } public void mouseClicked (MouseEvent e) { String s = new String(); eventoMouse.setText(s.format 01100 10011 (“Cliqueó en [%d,%d]", 10110 e.getX(), e.getY())); 01110 panelMouse.setBackground(Color.BLUE); 01100 10011 } 10110 01110 1001 1 11 0 0 1 … } Introducción a la Programación Orientada a Objetos IPOO - 2016 10110 01110 1001 1 11 0 0 1 … } Introducción a la Programación Orientada a Objetos IPOO - 2016 15 16 EVENTOS DEL MOUSE EVENTOS DEL MOUSE class OyenteMouse implements MouseListener{ … public void mouseExited (MouseEvent e) { String s = new String(); eventoMouse.setText(s.format 01100 ("Salió en [%d,%d]",1 0 0 1 1 10110 e.getX(), e.getY())); 01110 panelMouse.setBackground(Color.GREEN); 0 1 1 0 0 10011 } class OyenteMouse implements MouseListener{ … public void mouseReleased (MouseEvent e { String s = new String(); eventoMouse.setText(s.format 01100 ("Soltó en [%d,%d]",1 0 0 1 1 10110 e.getX(), e.getY())); 01110 panelMouse.setBackground(Color.MAGENTA);0 1 1 0 0 10011 } … } … } 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 Profesor Luciano H. Tamargo 17 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 18 3 Introducción a la Programación Orientada a Objetos java.awt.event.MouseListener EVENTOS DEL MOUSE EVENTOS DEL MOUSE mouseClicked(e:MouseEvent): void mousePressed(e:MouseEvent): void mouseReleased(e:MouseEvent): void class OyenteMouse implements MouseListener{ … public void mousePressed (MouseEvent e) { String s = new String(); eventoMouse.setText(s.format 01100 10011 ("Presionó en [%d,%d]", 10110 e.getX(), e.getY())); 01110 panelMouse.setBackground(Color.YELLOW); 0 1 1 0 0 10011 } 10110 01110 1001 1 11 0 0 1 } Introducción a la Programación Orientada a Objetos IPOO - 2016 mouseEntered(e:MouseEvent): void mouseExited(e:MouseEvent): void public class controlMouse extends JFrame { private JPanel panelMouse; private JLabel eventoMouse; 01100 10011 … class OyenteMouse implements MouseListener{ 10 01 11 11 00 public void mouseClicked(MouseEvent e) { }0 1 1 0 0 public void mousePressed(MouseEvent e) { }1 0 0 1 1 public void mouseReleased(MouseEvent e) { 10}01 11 11 00 public void mouseEntered(MouseEvent e) { }1 0 0 1 public void mouseExited(MouseEvent e) { } 1 1 1 0 0 } 1 } 19 20 private void hacerGUI(){ getContentPane().setLayout(new GridLayout(2,0)); panelMouse = new JPanel(); panelMouse.setBackground(Color.WHITE); panelMouse.setPreferredSize(new java.awt.Dimension(300, 150)); eventoMouse = new JLabel(); eventoMouse.setPreferredSize(new java.awt.Dimension(300,70)); public class controlMouse extends JFrame { private JPanel panelMouse; private JLabel eventoMouse;; … class OyenteMouse implements MouseListener, OyenteMouse escuchaMouse = new OyenteMouse(); panelMouse.addMouseListener(escuchaMouse); panelMouse.addMouseMotionListener(escuchaMouse); getContentPane().add(panelMouse); getContentPane().add(eventoMouse); } … } 21 EVENTOS DEL MOUSE public class controlMouse extends JFrame { private JPanel panelMouse; private JLabel eventoMouse;; … class OyenteMouse implements MouseListener, MouseMotionListener{ 01100 public void mouseDragged(MouseEvent e){ 10011 10110 String s = new String(); 01110 eventoMouse.setText(s.format("Arrastró a 0 1 1 0 0 [%d,%d]", e.getX(),e.getY()));} 10011 10110 public void mouseMoved(MouseEvent e){ 01110 String s = new String(); 1001 eventoMouse.setText(s.format("Se movió a 1 1 1 0 0 [%d,%d]", e.getX(),e.getY()));} 1 23 } } Profesor Luciano H. Tamargo EVENTOS DEL MOUSE 01100 10011 10110 MouseMotionListener{ public public public public public void void void void void mouseClicked(MouseEvent e) { }0 1 1 1 0 01100 mousePressed(MouseEvent e) { } 1 0 0 1 1 mouseReleased(MouseEvent e) { 1}0 1 1 0 mouseEntered(MouseEvent e) { }0 1 1 1 0 1001 mouseExited(MouseEvent e) { } 1 1 1 0 1 } } 0 22 OBJETOS Y EVENTOS • Con frecuencia una interface de eventos brinda más servicios que los que necesitamos. • Por ejemplo, la interface MouseListener ofrece cinco servicios, si nuestra GUI solo va a reaccionar ante 0un 1100 0011 click del mouse tenemos que definir el código 11de 0110 01110 mouseClicked, los otros cuatro quedan sin 01100 especificar. 10011 10110 • Sin embargo, si definimos una clase que implementa0 a 1110 1001 esta interface es necesario implementar todos los 1 11 servicios provistos. 0 0 1 Introducción a la Programación Orientada a Objetos IPOO - 2016 24 4 Introducción a la Programación Orientada a Objetos OBJETOS Y EVENTOS • Un adaptador es una clase que implementa todos los métodos de una interface, de modo que en lugar de implementar una interface podemos extender la clase adaptador. 01100 10011 • Para la interface MouseListener Java brinda la clase 10110 01110 MouseAdapter con cuerpo vacío para los cinco métodos. • Para MouseMotionListener la clase adaptador MouseMotionAdapter. Introducción a la Programación Orientada a Objetos IPOO - 2016 Profesor Luciano H. Tamargo 01100 1es 0011 10110 01110 1001 1 11 0 0 1 25 El objeto oyente es instancia de una clase que implementa una interface y redefine el método responsable de reaccionar ante la acción del usuario Evento Interno Evento Externo percibe dispara OBJETO FUENTE Component crea OBJETO EVENTO EventObject OBJETO Oyente ActionListener registrado a El objeto evento es un parámetro para el método manejador del Introducción a la Programación Orientada a Objetos evento IPOO - 2016 26 5