Applets IV : Eventos y oyentes ( Listeners )

En una Interfaz Gráfica de Usuario todo sucede a traves de eventos. El usuario tiene una ventana e interactúa con ella produciendo eventos, como el de picar en un botón por ejemplo. Para ello la Interfaz debe tener oyentes que estén a la espera de escuchar el click. Un oyente o listener es un objeto que implementa un tipo concreto de interfaz.

Todos los componentes de Swing incluyen el método addXXXListener() y removeXXXListener() de forma que se pueda recoger cualquier evento de la venana.

Aqui tienes un ejemplo de clase que te dirá si cualquier clase de Swing tiene listeners:

//MostrarAddListeners.java
//Muestra los métodos "add listener de cualquier clase Swing
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
import java.io.*;
import net.juantxu.swing.*;

public class MostrarAddListeners extends JApplet{
	Class clase;
	Method[] metodos;
	Constructor[] constr;
	String[] n = new String[0];
	JTextField nombre = new JTextField(25);
	JTextArea resultados = new JTextArea(20,10);

	class NombreL implements ActionListener{
		public void actionPerformed(ActionEvent e){
			// intentamos pasar lo que tenemos en la casilla de texto
			// al nombre de una clase de Swing
			String mm = nombre.getText().trim();
			if( mm.length() == 0 ){
				resultados.setText("No Coincide");
				n = new String[0];
				return;
			}
			try{
				clase = Class.forName("javax.swing."+mm); 
			}catch(ClassNotFoundException ex){ 
				resultados.setText("No Coincide");
				return;
			}
			// vale, es una clase Swing
			// pues recogamos los métodos
			metodos = clase.getMethods();
			// vamos a hacer una lista de Cadenas de Carácteres
			// recuerda, una matriz NO es redimensionable por lo que 
			// la tenemos que volver a definir con el tamaño apropiado
			n = new String[metodos.length];
			for (int i=0; i< metodos.length ; i++){
				n[i]=metodos[i].toString();
			}
			representar();
		}
	}
	void representar(){
		// creamos el conjunto de resultados
		String[] res = new String[n.length];
		int j=0;
		for (int i=0; i<n.length; i++){
			if ( n[i].indexOf("add") != -1 && n[i].indexOf("Listener") != -1){
				res[j++] = n[i].substring( n[i].indexOf("add") );
			}
		}
		resultados.setText("");
		for (int i =0; i<j; i++){
			resultados.append( res[i] + "\n");
		}
	}
	public  void init(){
	nombre.addActionListener(new NombreL() );
	JPanel cima = new JPanel();
	cima.add(new JLabel("Nombre de clase Swing ( Presione ENTER) :" ) );
	cima.add(nombre);
	Container cp = getContentPane();
	cp.setLayout( new GridLayout(2,1) );
	cp.add( cima);
	cp.add( new JScrollPane(resultados) );
	
	}
	public static void main(String[] args){
		Console.run(new MostrarAddListeners(), 400,300);	
	}
}

y el resultado es este Aqui tienes una completa lista de todos los listeners y que es lo que pueden hacer

El caso es que esto va por simplicidad. Si se implementa la interfaz oyente el componente escucha una accion. Si no. pues no. Pero se da el caso que son interfaces y por tanto, si tienen más de un método hay que implementarlos todos. Para eso se han creado los adaptadores. Que no son más que clases con todos los métodos implementados pero vacíos. De ese modo tu reescribes el que te interesa y punto.

Para comprobar que los eventos se lanzan efectivamente vamos a hacer esta prueba:

// RastrearEventos.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import net.juantxu.swing.*;

public class RastrearEventos extends JApplet{
	HashMap h = new HashMap();
	String[] evento = {
		"focusGained", "focusLost", "keyPressed", "keyReleased", "keyTyped", "mouseClicked", "mouseEntered", "mouseExited", "mousePressed", "mouseReleased", "mouseDragged", "mouseMoved"
	};
	MiBoton 
	b1=new MiBoton(Color.blue, "Boton 1"),
	b2=new MiBoton(Color.red, "Boton 2");
	
	class MiBoton extends JButton{
		void informar(String campo, String msg){
			( (JTextField)h.get(campo) ).setText(msg);
		}
		// fijate que declaro y defino el FocusListener en el mismo momento
		FocusListener f1 = new FocusListener(){
			public void focusGained(FocusEvent e){
				informar("focusGained", e.paramString() );
			}
			public void focusLost(FocusEvent e){
				informar("focusLost", e.paramString() );
			}			
		};
	
		KeyListener k1 = new KeyListener(){
			public void keyPressed(KeyEvent e){
				informar("keyPressed", e.paramString() );
			}
			public void keyReleased(KeyEvent e){
				informar("keyReleased", e.paramString() );
			}
			public void keyTyped(KeyEvent e){
				informar("keyTyped", e.paramString() );
			}	
		};
		MouseListener m1 = new MouseListener(){
			public void mouseClicked(MouseEvent e){
				informar("mouseClicked", e.paramString() );
			}
			public void mouseEntered(MouseEvent e){
				informar("mouseEntered", e.paramString() );
			}
			public void mouseExited(MouseEvent e){
				informar("mouseExited", e.paramString() );
			}	
			public void mousePressed(MouseEvent e){
				informar("mousePressed", e.paramString() );
			}
			public void mouseReleased(MouseEvent e){
				informar("mouseReleased", e.paramString() );
			}	
		};
		MouseMotionListener mm1 = new MouseMotionListener(){
			public void mouseDragged(MouseEvent e){
				informar("mouseDragged", e.paramString() );
			}
			public void mouseMoved(MouseEvent e){
				informar("mouseMoved", e.paramString() );
			}	
		};
		public MiBoton(Color color, String etiqueta){
			super(etiqueta);
			setBackground(color);
			addFocusListener(f1);
			addKeyListener(k1);
			addMouseListener(m1);
			addMouseMotionListener(mm1);
		}
	}
	public void init(){
		Container c = getContentPane();
		c.setLayout(new GridLayout(evento.length + 1 , 2) );
		for ( int i = 0; i< evento.length; i++){
			JTextField t = new JTextField();
			t.setEditable(false);
			c.add(new JLabel( evento[i], JLabel.RIGHT) );
			c.add(t);
			h.put(evento[i], t);
		}
		c.add(b1);
		c.add(b2);
	}
	public static void main(String[] args){
		Console.run(new RastrearEventos(), 700, 500);
	}
	
}

Y… mira el resultado

 
java/28.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki