Java Beans

Un Java Bean es una clase vulgar y normal enfocada a la programación visual. Un botón es un Bean, al igual que cualquiera de los elementos que puedas ubicar en una interfaz de usuario. Hay una convención acerca de los nombres de los métodos para que sean facilmente reconocibles y accesibles.

  1. En el caso de una propiedad de nombre xxx se crearán dos métodos públicos getXxx() y setXxx(). Cada uno nos dará o establecerá el valor de la propiedad xxx (generalmente privada)
  2. Para el caso de una propiedad booleana se puede substituir get por is por lo que obtendremos algo mucho mas legible ( isBlanco() devolverá si o no)
  3. Un bean puede hacer muchas otras cosas. (aunque no es aconsejable)
  4. Para los oyentes se usa el enfoque de oyentes de swing

En idioma coloquial. Cuando estás programando en entornos visuales. Tienes el formulario que estas creando, entonces coges un botón, o un cuadro de texto, o lo que sea, lo arrastras y lo dejas en el punto del formulario que tu quieres. Despues le dices que es lo que va a hacer cuando el usuario realice una acción. Pues eso. Eso es un bean. El botón o cuadro de texto, o lo que sea que pongas en el formulario.

Vamos a hacer un bean y a analizarlo despues.

// Rana.java
import java.awt.*;
import java.awt.event.*;

class Lugares{}

public class Rana{
	private int saltos;
	private Color color;
	private Lugares lugares;
	private boolean saltador;
	public int getSaltos(){return this.saltos;}
	public void setSaltos(int i){saltos=i;}
	public Color getColor(){return this.color;}
	public void setColor(Color c){color = c;}
	public Lugares getLugares(){return this.lugares;}
	public void setLugares(Lugares l){lugares= l;}
	public boolean isSaltador(){return this.saltador;}
	public void setSaltador(boolean s){saltador = s;}
	public void addActionListener( ActionListener a){}
	public void removeActionListener( ActionListener a){}
	public void addKeyListener( KeyListener k){}
	public void removeKeyListener( KeyListener k){}
	// un método public normal y corriente
	public void croar(){
		System.out.println("¡ Croack !");
	}
}

Aqui tenemos un bean tonto. Es una rana. que responde a ciertos eventos y que tienen ciertas propiedades (variables) a las que se accede a traves de ciertos métodos. Como puedes ver puedes hacer lo que quieras y todo bean responde a un mismo patrón. Este bean está listo y preparado para ser usado donde se quiera. Se le pueden especificar los valores iniciales de las propiedades y modificar después a traves de los métodos Getters y Setters Ahora vamos a hacer un Analizador de beans para ver que son accesibles y manipulables. A traves del Introspector extraemos todos sus métodos y así conseguimos poder acceder a ellos para establecerlos.

// VolcadorBean.java
import java.beans.*;
import java.lang.reflect.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import net.juantxu.swing.*;

public class VolcadorBean extends JApplet{
	JTextField consulta = new JTextField(20);
	JTextArea resultados = new JTextArea();
	
	public void pon(String s){
		resultados.append(s+"\n");
	}
	public void volcar(Class bean){
		resultados.setText("");
		BeanInfo bi = null;
		try{
			bi = Introspector.getBeanInfo( bean, java.lang.Object.class);
		}catch(IntrospectionException e){
			pon("no se ha podido hacer la introspeccion" + bean.getName() );
			return;
		}
		PropertyDescriptor[] propiedades = bi.getPropertyDescriptors();
		for(int i =0; i< propiedades.length; i++){
			Class p = propiedades[i].getPropertyType();
			pon("Tipo de la propiedad:\n " + p.getName() + "Nombre de la propieada" + propiedades[i].getName() );
			Method leerMetodo = propiedades[i].getReadMethod();
				if (leerMetodo != null ){
				pon("Leer metodo :\n" + leerMetodo);
			}
			Method escribirMetodo = propiedades[i].getWriteMethod();
			if (escribirMetodo != null ){
				pon("Escribir metodo :\n" + escribirMetodo);
			}
			pon("=================================");
		}
		pon("Metodos públicos :");
		MethodDescriptor[] metodos = bi.getMethodDescriptors();
		for(int i=0; i<metodos.length; i++){ pon( metodos[i].getMethod().toString() );	}
		pon("============================");
		pon("Soporte a eventos : ");
		EventSetDescriptor[] eventos = bi.getEventSetDescriptors();
		for(int i=0; i< eventos.length; i++){
			pon("tipo de oyente :\n" +  eventos[i].getListenerType().getName() );
			Method[] lm  = eventos[i].getListenerMethods();
			for(int j=0; j< lm.length; j++){
				pon("Metodo Oyente : \n"+ lm[j].getName() );
			}
			MethodDescriptor[] lmd = eventos[i].getListenerMethodDescriptors();
			for(int j=0; j< lmd.length; j++){
				pon("Descriptor del metodo : \n" + lmd[j].getMethod() );
			}
			Method  anadirOyente = eventos[i].getAddListenerMethod();
			pon("añadir metodo oyente" +  anadirOyente);
			Method  quitarOyente = eventos[i].getRemoveListenerMethod();
			pon("quitar metodo oyente" +  quitarOyente);
			pon("============================");
		}
	}
	class Volcador implements ActionListener{
		public void actionPerformed(ActionEvent e){
			String nombre = consulta.getText();
			Class c = null;
			try{
				c = Class.forName(nombre);
			}catch(ClassNotFoundException ex){
				resultados.setText("no se pudo encontrar la clase " + nombre);
				return;
			}
			volcar(c);
		}
	}
	public void init(){
		Container cp = getContentPane();
		JPanel p = new JPanel();
		p.setLayout(new FlowLayout());
		p.add(new JLabel("nombre del bean cualificado") );
		p.add(consulta);
		cp.add(BorderLayout.NORTH, p);
		cp.add(new JScrollPane(resultados) );
		Volcador vlc = new Volcador();
		consulta.addActionListener(vlc);
		consulta.setText("Rana");
		// forzamos la evaluacion
		vlc.actionPerformed(new ActionEvent(vlc, 0, "") );
	}
	public static void main(String[] args){
		Console.run(new VolcadorBean(), 600, 500);
	}
}

el resultado final es este

Vamos a hacer un bean chorra para verlo de una forma un poco más gráfica. El siguiente bean captura la posición del ratón y dibuja un círculo al rededor. Por otro lado, captura el evento del click del ratón y escribe ¡bang! ¡bang! como puedes ver, todo muy útil.

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

public class BeanExplosion extends JPanel implements Serializable{
	protected int mx, ym;
	protected int tamanioC = 40; // tamaño del circulo
	protected String texto= "¡Bang!";
	protected int tamanioFuente=48;
	protected Color colorT = Color.red;
	protected ActionListener oyenteAccion;
	public BeanExplosion(){
		addMouseListener(new ML() );
		addMouseMotionListener( new MML() );
	}
	public int getTamanioCirculo(){return this.tamanioC;}
	public void setTamanioCirculo(int i){ tamanioC = i;}
	public String getTextExplosion(){return this.texto; }
	public void setTextExplosion(String s){ texto = s;}
	public int getTamanioFuente(){ return this.tamanioFuente; }
	public void setTamanioFuente(int i){tamanioFuente = i; }
	public Color getColor(){return this.colorT;}
	public void setColor(Color c){colorT = c;}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.setColor(Color.blue);
		g.drawOval(mx - tamanioC/2, ym - tamanioC/2, tamanioC, tamanioC);
	}
	public void addActionListener(ActionListener l)throws TooManyListenersException {
		if(oyenteAccion != null) throw new TooManyListenersException();
		oyenteAccion = l;
	}
	public void removeActionListener(ActionListener l){
		oyenteAccion = null;
	}
	class ML extends MouseAdapter{
		public void mousePressed(MouseEvent e){
			Graphics g = getGraphics();
			g.setColor(colorT);
			g.setFont(new Font( "TimesRoman", Font.BOLD, tamanioFuente) );
			int ancho = g.getFontMetrics().stringWidth(texto);
			g.drawString(texto, (getSize().width - ancho) /2, getSize().height/2);
			g.drawString(texto, mx, ym);
			g.dispose();
			
			if(oyenteAccion != null) oyenteAccion.actionPerformed( new ActionEvent(BeanExplosion.this, ActionEvent.ACTION_PERFORMED, null) );

		}
	}
	class MML extends MouseMotionAdapter{
		public void mouseMoved(MouseEvent e){
			mx = e.getX();
			ym = e.getY();
			repaint();
		}
	}
	public Dimension getPreferredSize(){
		return new Dimension(200,200);
	}
}

Y ahora una clase para usar nuestro bean.

// PruebaBeanExplosion.java

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

public class PruebaBeanExplosion extends JApplet{
	JTextField txt = new JTextField(30);
	class BBL implements ActionListener{
		int contador = 0;
		public void actionPerformed(ActionEvent e){
			txt.setText("Accion bean explosion número : " +  contador++);
		}
	}
	public void init(){
		BeanExplosion bb = new BeanExplosion();
		try{
			bb.addActionListener(new BBL() );
		}catch(TooManyListenersException e){
			txt.setText("demasiados oyentes");
		}
		Container cp = getContentPane();
		cp.add(bb);
		cp.add(BorderLayout.SOUTH, txt);
	}
	public static void main(String[] s){
		Console.run(new PruebaBeanExplosion(), 400, 400);	
	}
}

Quedando tal que así

 
java/32.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