Вы находитесь на странице: 1из 11

U.D.

PROGRAMACION DISTRIBUIDA CONCURRENTE

Guia de Laboratorio # 09
09 DE JUNIO DEL 2011

EVENTOS
Indicadores de logro Implementar eventos para GUI

La gestin de eventos es de vital importancia en los programas que contienen una interfaz grfica de usuario. Aunque puede intimidar a los programadores principiantes, la gestin de eventos es MUCHO ms sencilla de lo que cree. A continuacin encontrar un resumen de los tres componentes clave de un pro ceso de gestin de eventos: o Objeto (botn, marco, campo de texto, etc.) que escucha el evento o Evento (hacer clic en un botn, pulsar una tecla, etc.) o Interfaz Listener (ActionListener, WindowListener, etc.) Evento Swing Cada vez que el usuario escribe un carcter o hace clic en un botn, la mquina virtual de Java (JVM) genera un evento. A continuacin se incluyen algunos ejemplos de eventos Swing: CUADRO Oyente de eventos Cada evento puede desencadenar uno o ms oyentes de dicho evento. Como ya dijimos la semana pasada, un oyente de eventos es una interfaz de Java que contiene una coleccin de declaraciones de mtodos. Las clases que implementan la interfaz deben definir estos mtodos. A continuacin se incluye una lista de eventos, oyentes y mtodos: CUADRO
cuadro. Por ejemplo, cuando el usuario hace clic en un botn, el ActionListener ser notificada y, entonces, desencadenar el mtodo actionPerformed a ejecutar.

Gestin de eventos en Swing

Registrar un gestor de eventos para el objeto Para escuchar un evento, un objeto debe registrarse para ser el oyente de dicho evento. El siguiente cdigo crea un JButton y registra el ActionListener correspondiente. JButton button = new JButton("Soy un botn Swing!"); button.addActionListener(this); 3 pasos para implementar un oyentede eventos Para implementar un gestor de eventos, debe seguir estos tres pasos: 1. Implementar una interfaz de escucha: public class MyClass implements ActionListener 2. Agregar el oyente a un objeto: button.addActionListener(this) 3. Definir los mtodos de la interfaz de escucha: public void actionPerformed(ActionEvent e){ package APLICA_EVENTOS;
LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO Pgina 1 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

import java.awt.*; import javax.swing.JFrame; public class Aplica0 extends JFrame { Button b1 = new Button("Aceptar"), b2 = new Button("Cancelar"); public Aplica0() { setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20)); add(b1); add(b2); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public boolean action(Event e, Object o) { if (e.target.equals(b1)) System.out.println("Botn uno pulsado."); else if (e.target.equals(b2)) System.out.println("Botn dos pulsado."); else return super.action(e, o); return true; } public static void main(String[] args) { Aplica0 f = new Aplica0(); f.resize(200, 300); f.show(); } }

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 2 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

Ahora demostraremos el funcionamiento con el siguiente ejemplo GUI APLICA01 package APLICA_EVENTOS; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Aplica01 extends JFrame implements ActionListener { int numClicks = 0; JPanel pane = new JPanel(); JLabel label = new JLabel("Nmero de clics de botones: " + numClicks); JButton button = new JButton("Soy un botn Swing!"); //Constructor Aplica01() { super("SwingApplication"); //define el ttulo del marco //Grid Layout fila,column pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); this.getContentPane().add(pane, BorderLayout.CENTER); button.addActionListener(this); //para generar eventos hay que seguir los siguientes pasos //1. Implementar una interfaz de escucha: //public class SwingApplication extends JFrame implements ActionListener //2. Agregar el oyente al botn objeto Fuente(una vez creado) // button.addActionListener(this); //3. Definir los mtodos de la interfaz de escucha: } public void actionPerformed(ActionEvent e) { numClicks++; label.setText("Nmero de clics de botones: " + numClicks); } public static void main(String[] args) { Aplica01 app = new Aplica01(); app.pack(); app.setVisible(true); } } APLICA02 Aplicacin en JAVA que valida el ingreso de un texto

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 3 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

Si ingresa un texto muestra un mensaje de saludo

package APLICA_EVENTOS; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Aplica02 extends JFrame implements ActionListener { JPanel pane = new JPanel(); JLabel label = new JLabel("Ingrese nombre: " ); JTextField text = new JTextField(20); JButton button = new JButton("Presionar!"); //Constructor Aplica02() { super("SwingApplication"); //define el ttulo del marco this.setSize(140, 410); pane.add(label); pane.add(text); pane.add(button); this.getContentPane().add(pane, BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (text.getText().equalsIgnoreCase("")) { JOptionPane.showMessageDialog(null, "Ingrese un nombre."); } else { JOptionPane.showMessageDialog(null, "Hola: " + text.getText()); } } }); } public static void main(String[] args) { Aplica02 app = new Aplica02(); app.pack(); app.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { throw new UnsupportedOperationException("Not supported yet."); } }

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 4 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

EL MISMO EJEMPLO PERO SIN CLASE INTERNA package APLICA_EVENTOS;

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

public class aplica02sinclaseinterna extends JFrame implements ActionListener {

int numClicks = 0; JPanel pane = new JPanel(); JLabel label = new JLabel("Nmero de clics de botones: " + numClicks); JButton button = new JButton("Soy un botn Swing!"); JTextField text = new JTextField(10); //Constructor

aplica02sinclaseinterna() { super("SwingApplication"); //define el ttulo del marco //Grid Layout fila,column pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); pane.add(text); this.getContentPane().add(pane, BorderLayout.CENTER); button.addActionListener(this); //para generar eventos hay que seguir los siguientes pasos //1. Implementar una interfaz de escucha: //public class SwingApplication extends JFrame implements ActionListener

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 5 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

//2. Agregar el oyente al botn objeto Fuente(una vez creado) // button.addActionListener(this); //3. Definir los mtodos de la interfaz de escucha:

} public void actionPerformed(ActionEvent e) {

{ if (text.getText().equalsIgnoreCase("")) { JOptionPane.showMessageDialog(null, " ngrese un nombre."); I } else { JOptionPane.showMessageDialog(null, "Hola: " + text.getText()); } } } public static void main(String[] args) { aplica02sinclaseinterna app = new aplica02sinclaseinterna(); app.pack(); app.setVisible(true);

} }

Escucha de objetos mltiples


Qu ocurre si hay varios objetos escuchando al mismo evento? Cmo decide Java qu

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 6 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

mtodo actionPerformed ejecutar? Por ejemplo, tenemos dos botones, b1 y b2. Los dos estn registrados como un ActionListener. Si el usuario hace clic en b1, el mensaje se ha hecho clic en b1 se imprimir en la etiqueta. Si el usuario hace clic en b2, el mensaje se ha hechoclic en b2 se imprimir. Por tanto, necesitamos implementar el mtodo actionPerformed del siguiente modo:

// 1. En la seccion de declaraciones JButton button2 = new JButton("B2"); //2. en el constructor button2.addActionListener(this); b1.addActionListener (this);

// 3. en el mtodo agregariamos un if para saber que boton pulso Public void actionPerformed (ActionEvent e) { if (e.getSource() == button) //Qu objeto es el origen del evento? label.setText (se imprime b1); if (e.getSource() == button2) label.setText (se imprime b2); } /*

Ahora volvamos a nuestra SwingApplication. Necesitamos implementar otro evento; queremos que la aplicacin se cierre cuando el usuario cierre la ventana. De nuevo,

LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO

Pgina 7 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

seguiremos estos pasos: y Evento: WindowEvent y Objeto: marco y Interfaz: WindowListener con el mtodo windowClosing Un momento; hay 7 mtodos en la interfaz WindowListener. Como ya mencionamos anteriormente, la clase que implementa las interfaces debera definir TODOS los mtodos de dicha interfaz. Esta regla es vlida para interfaces como ActionListener, que slo tienen un mtodo. Pero WindowListener tiene 7 (s, 7) mtodos. Tendremos queimplementarlos todos, incluso si slo necesitamos uno?La respuesta es s y no. Si implementa WindowListener, S, deber implementar TODOS los 7 mtodos. Ya lo s, escribir el cdigo para seis mtodos que no vamos a utilizar es el tipo de trabajo tedioso que a nadie le gusta hacer. Para simplificar esta tarea, Java ha desarrollado una clase adaptadora para cada interfaz de escucha que tenga ms de un mtodo. Una clase de este tipo implementa todos los mtodos en la interfaz pero no hace nada con ellos. A continuacin se indica cmo utilizar un adaptador.

IMPLEMENTAR UNA INTERFACE WINDOWSLISTENER CON TODOS SUS METODOS


package APLICA_EVENTOS; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.event.ActionListener; import java.awt.event.WindowListener; class Aplica031 extends JFrame { public Aplica031() { this.setTitle("Hola!!!"); this.setSize(500, 200); //LE INDICAMOS AL FRAME QUIEN SERA SU MANEJADOR DE EVENTOS //DE VENTANA:UN OBJETO DE TIPO MANEJADOR QUE CREAMOS AQUI this.addWindowListener(new manejador()); } class manejador implements WindowListener { public void windowClosing(WindowEvent e) { System.out.println("salir"); //ESTA SENTENCIA TERMINA LA MAQUINA VIRTUAL System.exit(0); }
LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO Pgina 8 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

//METODOS QUE NO HACEN NADA PERO HE DE SOBREESCRIBIR //PORQUE IMPLEMENTAMOS LA INTERFACE public void windowOpened(WindowEvent e) {}; public void windowClosed(WindowEvent e){}; public void windowActivated(WindowEvent e) {}; public void windowDeactivated(WindowEvent e) {}; public void windowIconifield(WindowEvent e) {}; public void windowDeiconifield(WindowEvent e) {}; @Override public void windowIconified(WindowEvent e) { throw new UnsupportedOperationException("Not supported ye t."); } @Override public void windowDeiconified(WindowEvent e) { throw new UnsupportedOperationException("Not supported yet."); } } public static void main(String[] args) { Aplica031 frame=new Aplica031(); frame.show();//obsoleto } } MOSTRAR COLORES package APLICA_EVENTOS; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MostrarColores extends JFrame{ private JButton cambiarColor; // Constantes de colores de Java ,se escriben en mayuscula private Color color = Color.LIGHT_GRAY; private Container contenedor; //configurar la GUI public MostrarColores(){ super("Uso de JColorChooser"); contenedor = getContentPane(); contenedor.setLayout(new FlowLayout() ); //configurar cambiarColor y registrar su manejador de eventos cambiarColor = new JButton("Cambiar color"); cambiarColor.addActionListener( new ActionListener(){ // clase interna anoni a m
LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO Pgina 9 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

// mostrar JColorChooser cuando usuario presione el boton public void actionPerformed(ActionEvent evt){ color = JColorChooser.showDialog( MostrarColores.this, "Seleccione un color", color); // establece color predeterminado si no se selec ciona uno. if (color == null){ color = Color.LIGHT_GRAY; } // cambiar el color del fondo del panel de contenido contenedor.setBackground(color); } } // fin de clase interna anonima ); contenedor.add(cambiarColor); setSize(400,130); setVisible(true); } // fin de constructor de MostrarColores // Ejecutar la aplicacion public static void main(String [] args){ MostrarColores aplicacion= new MostrarColores(); aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

ADAPTADORES

AdaptadorClaseInterna.java package DemoExplicaEventos; import java.awt.*; LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO Pgina 10 de 11

U.D. PROGRAMACION DISTRIBUIDA CONCURRENTE

import java.awt.event.*; import javax.swing.*; public class AdaptadorClaseInterna extends JFrame { Panel miPanel; AdaptadorClaseInterna() { Frame f = new JFrame("Ventana Minimiza"); f.setSize(320, 240); f.setVisible(true); miPanel=new Panel(); this.setContentPane(miPanel); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { new AdaptadorClaseInterna(); } } ADAPTADOR WINDOWLISTER /* * APLICACION JAVA CON ADAPTADORES PARA WINDOWLISTENER package DemoExplicaEventos; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AdaptadorWindowListener extends JFrame { Panel miPanel; AdaptadorWindowListener() { Frame f = new JFrame("Ventana Minimiza"); f.setSize(320, 240); f.setVisible(true); miPanel=new Panel(); f.addWindowListener(new WindowMonitor()); this.setContentPane(miPanel); } class WindowMonitor extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String args[]) { new AdaptadorWindowListener(); } } LIC. GINA HUERTAS CAMACHO | V B-10 DIURNO Pgina 11 de 11

Вам также может понравиться