La técnica del doble buffer proporciona la mejor solución para el problema de las animaciones,
aunque requiere una programación algo más complicada. La idea básica del doble buffer es realizar
los dibujos en una imagen invisible, distinta de la que se está viendo en la pantalla, y hacerla visible
cuando se ha terminado de dibujar, de fonna que aparezca instantáneamente.
Para crear el segundo buffer o imagen invisible hay que crear un objeto de la clase Image del
mismo tamaño que la imagen que se está viendo y crear un contexto gráfico u objeto de la clase
Graphics que permita dibujar sobre la imagen invisible. Esto se hace con las sentencias.
Image imglnv;
Graphics graphlnv;
Dimensión dimlnv;
Dimensión d = size(); // se obtiene la dimensión del panel
en la clase que controle el dibujo (por ejemplo en una clase que derive de Panel).
El siguiente paso
es re-definir el método updateQ de fonna que no borre la imagen anterior con el color de fondo.
Deberá llamar directamente al método paintQ:
public void update (Graphics g) {
paint(g); // Sin borrar la imagen anterior se llama al método paint()
} // fin del método update()
En el método paintQ se modifica el código de modo que primero se dibuje en la imagen
invisible y luego ésta se haga visible:
public void paint (Graphics g) {
// se comprueba si existe el objeto invisible
y si sus dimensiones son correctas
if ((graphlnv==null) II (d.width!=dimlnv.width) II (d.height!=dimlnv.height)) {
dimlnv = d;
if ((graphlnv==null) II (d.width!=dimlnv.width) II (d.height!=dimlnv.height)) {
dimlnv = d;
// se llama al método createImage de la clase
Component
imglnv = createlmage(d.width, d.height);
// se llama al método getGraphics de la clase Image
graphlnv = imglnv.getGraphics();
imglnv = createlmage(d.width, d.height);
// se llama al método getGraphics de la clase Image
graphlnv = imglnv.getGraphics();
}
// se establecen las propiedades del contexto
gráfico invisible,
// y se dibuja sobre él
// y se dibuja sobre él
graphlnv.setColor(Color.white); // Se borra
pintando de blanco
graphlnv.fillRect(0, 0, dimlnv.width, dimlnv.height) ;
graphlnv.setColor(Color.white); // Se asigna un color para dibujar
// Sentencias para dibujar sobre graphlnv
graphlnv.drawLine(0, 0, 100, 100);
graphlnv.fillRect(0, 0, dimlnv.width, dimlnv.height) ;
graphlnv.setColor(Color.white); // Se asigna un color para dibujar
// Sentencias para dibujar sobre graphlnv
graphlnv.drawLine(0, 0, 100, 100);
// finalmente se hace
visible la imagen invisible a partir del punto (0, 0)
// utilizando el propio panel como ImageObserver
// utilizando el propio panel como ImageObserver
g.drawImage(imglnv,
0, 0, this);
} // fin del método paint()
} // fin del método paint()
Los gráficos y las
animaciones son particularmente útiles en las applets. El Tutoríal de Sun tiene un ejemplo (un applet) completamente explicado y desarrollado sobre las
animaciones y los distintos métodos de eliminar el flicker o paipadeo.
No hay comentarios:
Publicar un comentario