Está en la página 1de 3

%RWRQHVUHGRQGRVHQ-DYD \RWUDVIRUPDV 

 Si ya ests cansado de los tpicos botones cuadrados, es hora de cambiar un poco y crear interfacesgrficas ms bonitas. En el ejemplo que mostrar a continuacin vamos a crear un botn redondo, pero con unas cuantas modificaciones se pueden crear botones ovaldos (casi lo mismo), rectngulos redondeados, estrellas, entre otros. Vamos a crear el botn paso a paso... Lo primero es importar las clases a utilizar: import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; Para crear sta clase, vamos a reutilizar la clase JButton para mantener toda la funcionalidad de un botn, excepto aquello que interesa en este caso particular. Esto nos d una serie de ventajas, como lo es el sobreescribir los mtodos de Jbutton, que de una u otra forma modifiquen las propiedades visuales del botn: public class BotonRedondo extends JButton Y creamos dos objetos de la clase Color, que guardarn los valores corespondientes al color del botn, y el color que toma cuando est presionado: private Color colorFondo,colorPresionado; El constructor de la clase recibe tres argumentos: el primero de ellos es el rtulo del botn, es decir, el texto que tiene el botn; los argumentos dos y tres reciben objetos Color corespondientes alcolor del botn, y el color que toma cuando est presionado. Lo primero que hacemos es invocar al mtodo super(), para pasar al constructor de la superclase (public Jbutton(String label)) el rtulo del botn. Despus asignamos los colores respectivos, y en seguida se invoca al mtodo setContentAreaFilled(), que es el encargado de pintar la zona correspondiente al foco del botn, para que en este caso no pinte el fondo del botn. public BotonRedondo(String rotulo,Color fon,Color pre) { super(rotulo); colorFondo=fon; colorPresionado=pre; setContentAreaFilled(false); } La primera parte interesante del ejemplo es el mtodo sobrescrito paintComponent(). Este es el mtodo que pinta el botn en el color correspondiente al estado en que se encuentre, y tambin coloca el rtulo que se haya indicado en el centro del botn. Esto se hace con dos simples if,

utilizando el mtodo getModel().isArmed(), para saber si el boton est, o no, presionado. En l se utiliza el mtodo fillOval() de la clase Graphics para pintar un crculo relleno, y acto seguido se hace una llamada al mismo mtodo de la superclase para que pinte el rtulo del botn sobre el crculo: protected void paintComponent( Graphics g ) { if(getModel().isArmed()) { g.setColor(colorPresionado); } else { g.setColor(colorFondo); } g.fillOval(0,0,getSize().width-1,getSize().height-1); super.paintComponent(g); } Tambin se sobrescribe el mtodo paintBorder() para pintar un borde alrededor del botn, llamando al mtodo drawOval() de la clase Graphics: protected void paintBorder( Graphics g ) { g.setColor(getForeground()); g.drawOval(0,0,getSize().width-1,getSize().height-1 ); } El siguiente cdigo interesante es el encargado de responder solamente cuando el usuario pulsa el botn del ratn con el cursor posicionado dentro del crculo, y no hacer nada cuando se hace fuera. Por defecto, un objeto de tipo JButton responde a las pulsaciones de ratn en un rea rectangular alrededor del ratn. No obstante, el objeto JButton no tiene idea de la forma real del botn, as que asume que es rectangular. Para indicar al objeto JButton la forma real del botn, es necesario sobreescribir el mtodo contains(). A este mtodo se le pasa una coordenada y responde true si la coordenada est dentro del botn y false en caso contrario. El mtodo, en este caso concreto del botn redondo, utiliza un objeto Shape (Ellipse2D) para determinar si la coordenada se encuentra dentro o fuera del crculo. Shape figura; public boolean contains(int x,int y) { if(figura==null!figura.getBounds().equals(getBounds())) { figura = new Ellipse2D.Float(0,0,getWidth(),getHeight());

} return } El resultado es algo as:

(figura.contains(x,y));

Las pruebas respectivas a sta clase las he hecho en el JDK1.4, pero segn algo que le (no recuerdo donde), en el JDK 1.2.2 hay un pequeo bug en la implementacin del objeto JButton, concretamente en el tratamiento de los eventos de arraste del ratn. En un funcionamietno correcto, si se pulsa dentro del crculo y se arrastra el cursor fuera del permetro del crculo (manteniendo pulsado el botn) se debera producir un cambio en la apariencia del botn. Al devolver el cursor al crculo, el botn debera recuperar su apariencia inicial, la misma que antes de iniciar el arrastre. Desafortunadamente, el cdigo que implementa esta funcionalidad no llama al mtodo contains(); en su lugar, utiliza los lmites del botn (el rea ms pequea que contiene al botn). Si utilizas el JDK 1.2.2 puedes observar que si arrastras el cursor lentamente fuera del crculo, pero sin salirse del rea rectangular del botn, ste no altera su apariencia. La nica solucin a este pequeo defecto consiste en implementar toda la funcionalidad uno mismo, pero eso se sale del verdadero objetivo de este artculo.

También podría gustarte