##
DISEÑO DE COMPONENTES PROPIOS

También podemos atrevernos en el diseño de Componentes propios. Deberán ser una subclase de Canvas o Panel. Para mostrarlos en pantalla deberemos sobreescribir los métodos paint(), update(), minimumSize() y preferredSize() y para controlar los eventos tendremos que sobreescribir el método handleEvent().

Para que podamos reusarlos, tenemos que poner cuidado en el diseño, implementando métodos get y set, lanzando excepciones cuando proceda y permitiendo el acceso a los campos de que disponga nuestro Componente.

Veamos un ejemplo, Separador.java, en que a partir de la clase Canvas, creamos un separador que será una línea vertical u horizontal simulando tres dimensiones.

    import java.awt.*;

    public class Separador extends Canvas {
        public final static int HORIZONTAL = 0;
        public final static int VERTICAL = 1;

        int orientacion;
        Dimension sepTama,sepDim;

        public Separador( int lon,int thick,int orient ) {
            orientacion = orient;
            if( orient == HORIZONTAL )
                sepTama = new Dimension( lon,thick );
            else
                sepTama = new Dimension( thick,lon );
            }

        public int getOrientacion() {
            return orientacion;
            }

        public void setOrientacion( int orient) {
            if( orient > VERTICAL || orient < HORIZONTAL )
                throw new IllegalArgumentException( "Orientación ilegal" );

            if( orientacion != orient )
                {
                orientacion = orient;
                sepDim = new Dimension( sepDim.height,sepDim.width );
                invalidate();
                }
            }

        public Dimension preferredSize() {
            return sepDim;
            }

        public Dimension minimumSize() {
            return sepDim;
            }

        public void paint( Graphics g ) {
            int x1,y1,x2,y2;
            Rectangle bbox = bounds();
            Color c = getBackground();
            Color brillo = c.brighter();
            Color oscuro = c.darker();

            if( orientacion == HORIZONTAL )
                {
                x1 = 0;
                x2 = bbox.width - 1;
                y1 = y2 = bbox.height/2 - 1;
                }
            else
                {
                x1 = x2 = bbox.width/2 - 1;
                y1 = 0;
                y2 = bbox.height - 1;
                }

            g.setColor( oscuro );
            g.drawLine( x1,y1,x2,y2 );

            g.setColor( brillo );
            if( orientacion == HORIZONTAL )
                g.drawLine( x1,y1+1,x2,y2+1 );
            else
                g.drawLine( x1+1,y1,x2+1,y2 );
            }
        }

El código que mostramos a continuación EjSeparador.java, muestra un ejemplo de uso de nuestro separador recién creado:

    import java.awt.*;
    import java.applet.Applet;

    public class EjSeparador extends Applet {
        public final static int HORIZONTAL = 0;
        public final static int VERTICAL = 1;

        public void init() {
            setLayout( new BorderLayout() );

            TextField texto1 = new TextField( "Hola",20 );
            TextField texto2 = new TextField( "que tal",20 );
            Separador raya = new Separador( 8,2,HORIZONTAL );

            add( "North",texto1 );
            add( "Center",raya );
            add( "South",texto2 );
            }
        }

Y ahora podemos complicar nuestro Componente, o utilizarlo como base para el desarrollo de otros más complejos. Por ejemplo, vamos a implementar un Componente de Grupo, que extenderemos de la clase Panel y que la utilizaremos para enmarcar a otros Componentes, tal como se utiliza en otros entornos de ventanas. En el código fuente de la implementación del Componente, Grupo.java, podemos observar que las acciones seguidas son exactamente las mismas que en el caso anterior: sobreescribir los métodos que necesitamos y punto.

    import java.awt.*;

    public class Grupo extends Panel {
        String Rotulo;
        int altoTexto;
        int longTexto;
        int offset;
        static Font defFuente;
        FontMetrics metFuente;

        public Grupo( String titulo ) {
            altoTexto = 20;
            longTexto = 20;
            offset = 10;
            Rotulo = titulo;
            setLayout( null );
            metFuente = getFontMetrics( defFuente );
            }

        public void paint( Graphics g ) {
            Dimension d = size();
            Font fuente = getFont();
            if( fuente != null )
                metFuente = getFontMetrics( fuente );

            longTexto = metFuente.stringWidth( Rotulo );
            altoTexto = metFuente.getHeight();
            g.setColor( Color.gray );
            g.drawRect( 0, altoTexto/2,d.width-3,d.height-altoTexto/2-3 );
            g.setColor( Color.white );
            g.drawRect( 1,altoTexto/2+1,d.width-3,d.height-altoTexto/2-3 );
            g.setColor( getBackground() );
            g.drawLine( offset,altoTexto/2,offset+longTexto+12,altoTexto/2 );
            g.drawLine( offset,altoTexto/2+1,offset+longTexto+12,altoTexto/2+1 );
            g.setColor( getForeground() );
            g.drawString( Rotulo,offset+6,altoTexto-3 );
            }

        public boolean handleEvent( Event evt ) {
            return( super.handleEvent( evt ) );
            }

        public Dimension preferredSize() {
            return( minimumSize() );
            }

        public Dimension minimumSize() {
            return( new Dimension( 100,100 ) );
            }

        static {
            defFuente = new Font( "Dialog",0,12 );
            }
        }

Un ejemplo de uso, lo podremos observar compilando y ejecutando el código que se puestra a continuación, EjGrupo.java:

    import java.awt.*;
    import java.applet.Applet

    public class EjGrupo extends Applet {
        Label etiq;
        Button izqda;
        Button dcha;
        Button todo;

        public void init() {
            setBackground( Color.lightGray );
            setLayout( null );

            Grupo g = new Grupo( "Etiqueta" );
            add( g );
            g.setFont( new Font("Dialog",0,14 ) );
            g.reshape( insets().left + 10,insets().top + 20,290,40 );
            g.setLayout( new FlowLayout( FlowLayout.CENTER,10,10 ) );
            etiq = new Label( "Hola Java!" );
            g.add( etiq );

            Grupo g2 = new Grupo( "Botones" );
            add( g2 );
            g2.reshape( insets().left+10,80,290,60 );
            izqda = new Button( "Botn 1" );
            g2.add( izqda );
            izqda.reshape( 20,20,70,30 );
            dcha = new Button( "Botn 2" );
            g2.add( dcha );
            dcha.reshape( 110,20,70,30 );
            todo = new Button( "Botn 3" );
            g2.add( todo );
            todo.reshape( 200,20,70,30 );
            }
        }

|  | ##### [Anterior] [Indice] [Siguiente]