| Artículos | 01 DIC 1998

Biblioteca AWT: Gestión de componentes

Tags: Histórico
Curso Java para Internet (VI)
Jaime Peña.

En pasados artículos, habíamos comentado cómo realizar dibujos de figuras simples ?utilizando la clase Graphics?; ahora expondremos algunas técnicas que mejoran las funciones básicas, de manera que eviten efectos molestos en pantalla y borrados de partes del área de dibujo . Por otro lado, antes de adentrarnos más en el uso de componentes ?léase, si lo desea, controles?, expondremos cómo es posible situarlos en pantalla, mediante los denominados Layout Managers .

Doble buffer y método update

Para evitar el parpadeo durante las operaciones de redibujado de pantalla y en las animaciones, puede emplearse la técnica del doble buffer y llamadas al método update desde paint . Con ello se logran dos propósitos, evitar perder las imágenes anteriores al dibujar unas nuevas y que no se provoquen parpadeos en los repintados, que resultan extremadamente molestos al usuario .

La técnica del doble buffer, observe el Listado 28, se basa en crear un objeto Graphics sobre el que se realizan todas las operaciones de dibujo; este objeto no es visible, de manera que resulta ser un área no visible de dibujo . Posteriormente, una vez finalizadas las operaciones de diseño, se invocará al método paint ( ) y en él se vierte el contenido del objeto Graphics en el contexto gráfico del applet o la aplicación AWT Java ?una llamada a repaint ( ) ? . En el ejemplo antes aludido, hemos implementado dos sencillas animaciones ?algo que trataremos con más detenimiento en artículos posteriores?; una de ellas utiliza técnicas de doble buffer para mover una imagen sobre otra, en el segundo caso no . Al ejecutar el applet, notará muy claramente la diferencia .

Por otra parte, el método update ( ) es muy adecuado para realizar una llamada al método paint ( ) pero, a diferencia de lo que acontecería con una llamada directa a repaint ( ) sin estar definido update ( ) , no se borrará el contenido anterior del contexto gráfico . Es decir, se evita que la inserción de nuevos elementos precise redibujar también los anteriores o, en otro caso, estos desaparezcan .

Note que la secuencia de pasos a seguir para emplear estas dos técnicas es bastante simple:

1 Declarar un objeto Graphics global, que utilizaremos como buffer; en nuestro ejemplo:Graphics bufferG;

2 Crear un objeto Image para contener el dibujo en dicho contexto gráfico . También se declarará como global: Image bufferImg;

3 Inicializar ambos objetos en el método init ( ) : bufferImg = createImage ( this . getSize ( ) . width,

this . getSize ( ) . height ) ;

bufferG = bufferImg . getGraphics ( ) ;

Observe que aquí fijamos el ancho y alto de la imagen, de manera que sólo ocupe el área de trabajo del applet o la aplicación AWT, tomando los valores con getSize ( ) . with y getSize ( ) . height . Posteriormente asociamos el contexto gráfico de la imagen con el buffer creado .

4 Realizar las operaciones de dibujo en el buffer; por ejemplo, en el Listado 28 se llevan a cabo en el método paint ( ) ?podrían llevarse a cabo en cualquier otro? . Así, si queremos incluir un rectángulo relleno de un determinado color, el código podría ser: bufferG . setColor ( Color . blue ) ;

bufferG . fillRect ( 0,0,200,100 ) ;

5 Invocar el método repaint ( ) en el momento deseado . Para evitar el borrado del contenido gráfico anterior, definimos el método update ( ) de la forma: public void update ( Graphics g ) { paint ( g ) ;}

6 En paint ( ) trasvasamos el contenido de la imagen del buffer, mediante el método drawImage del contexto gráfico del applet o aplicación gráfica AWT, que es el parámetro asociado a paint ( Graphics g ) :

g . drawImage ( bufferImg,0,0,this ) ;

En el Listado 29, se recoge un ejemplo de una aplicación sencilla de dibujo . En ella se emplean las técnicas de doble buffer y update ( ) , para diseñar rectángulos rellenos de diversos colores, conforme se arrastra el ratón . Parte de las técnicas, referentes a la gestión de eventos, serán explicadas en posteriores artículos .

Impresión de elementos gráficos

Para obtener una copia impresa de componentes y figuras, se emplea fundamentalmente el método print ( graphics g ) , o alternativamente printAll ( graphics g ) . Ambos toman como parámetro el contexto gráfico que nos interesa imprimir y puede referirse a un área de dibujo cualquiera . Por defecto, el método alude al contexto gráfico al que apunta el método paint, pero podría redireccionarse a un contexto gráfico en memoria ?véase lo comentado más arriba . Por ejemplo, si se trata de imprimir el área de trabajo de una aplicación gráfica AWT ?no de un applet?, el código de respuesta a pulsar un botón de comando para imprimir sería algo similar a:

void button3_actionPerformed (

ActionEvente ) {

Toolkit t = getToolkit ( ) ;

PrintJob job = t . getPrintJob ( this,

" Prueba " , ( Properties ) null ) ;

if ( job ! = null ) {

Graphics pg = job . getGraphics ( ) ;

if ( pg ! = null ) {

printAll ( pg ) ;

pg . dispose ( ) ;

}

job . end ( ) ;

}

}

En el caso de un applet, el control de la impresión se realiza mediante el navegador de Internet ?Internet Explorer o Netscape? . De todas formas, se puede implementar un método de sacar copiar impresas del área del applet ?sólo si se visualiza con la utilidad AppletViewer o similar? mediante el cambio a un frame nulo . No es un método que funcione del todo bien, ya que componentes tipo Panel pueden ocultar lo que en ellos hay . Será cuestión de probar cambiando la línea de código:

PrintJob job = t . getPrintJob ( ( Frame ) null,

" Prueba " , ( Properties ) null ) ;

Inserción de componentes AWT

Los componentes AWT, que fueron referenciados en nuestro anterior artículo ?etiquetas, botones de comando, menús, listas desplegables, ??, no se insertan en el método paint ( ) , a diferencia de los dibujos de figuras simples derivadas de la clase Graphics; se crean en el método init ( ) y deben hacerse explícitamente visibles, mediante el método add ( componente ) . Posteriormente, cada componente puede ocultarse y mostrarse a nuestro antojo, utilizando su método setVisible ( true o false ) ; por ejemplo:

Label1 . setVisi ble ( false ) ;

Si nos fijamos en el componente Button ?un botón de comandos, tal vez el componente AWT más utilizado?, dispone de dos tipos de constructores . Por ejemplo, podríamos crear un objeto de la forma:

Button Boton1;

?

Boton1 = new Button ( ) ;

O bien podríamos utilizar un segundo tipo de constructor, qué, a la vez, ya incluye una etiqueta que aparecerá como texto del botón:

Button Boton2;

?

Boton2 = new Button ( " Rojo " ) ;

Los métodos disponibles se refiere, fundamentalmente a fijar y recuperar su etiqueta, así, el código:

Button Boton1;

String nombre1;

?

Boton1 = new Button ( ) ;

Boton1 . setLabel ( " Rojo " ) ;

?

nombre1 = Boton1 . getLabel ( ) ;

Creará un botón y posteriormente se fija su etiqueta y se recupera en una variable tipo String . En su momento hablaremos de los métodos de respuesta a eventos, algo que posponemos para algo más adelante . Para resumir lo visto, un applet que incluye un simple botón podría tener el aspecto:

import java . awt . *;

public class AppletBoton0

extends java . applet . Applet {

Button Boton1;

public void init ( ) {

Boton1 = new Button ( ) ; <

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información