Cuando un gr�fico es complejo o se usa repetidamente, podemos reducir el tiempo que tarda en mostrarse renderiz�ndolo primero en un buffer fuera de pantalla y luego copiando el buffer en la pantalla. Esta t�cnica, llamada doble buffer, se usa frecuentemente para animaciones.
|
Nota:
Cuando dibujamos sobre un componente Swing, �ste utiliza autom�ticamente el doble buffer. |
Un BufferedImage puede usarse f�cilmente como un buffer fuera de pantalla. Para crear un BufferedImage cuyo espacio, color, profundidad y distribuci�n de pixels corresponden exactamente la ventana en la que son dibujados, se llama al m�todo Component. createImage. Si necesitamos control sobre el tipo de la imagen fuera de la pantalla, la transparencia, podemos construir directamente un objeto BufferedImage y usarlo como un buffer.
Para dibujar dentro de una imagen almacenada, se llama al m�todo BufferedImage.createGraphics para obtener el objeto Graphics2D; luego se llama a los m�todos de dibujo apropiados del Graphics2D. Todo el API de dibujo de Java 2D puede usarse cuando se dibuja sobre un BufferedImage que est� siendo utilizado como un buffer fuera de pantalla.
Cuando estemos listos para copiar el BufferedImage en la pantalla, simplemente llamamos al m�todo drawImage sobre el Graphics2D de nuestro componente y pasarlo en BufferedImage.
�Ejemplo: BufferedShapeMover
El siguiente applet permite al usuario arrastrar un rect�ngulo sobre la ventana del
applet. En lugar de dibujar el rect�ngulo en cada posici�n del cursor, para proporcionar
informaci�n al usuario, se usa un BufferedImage como buffer fuera de
la pantalla. Cuando se arrastra el rect�ngulo, es renderizado dentro del
BufferedImage en cada nueva posici�n y el BufferedImage se
copia en la pantalla.

Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El applet aparecer� en una nueva ventana del navegador.
El c�digo completo del applet est� en BufferedShapeMover.java.
Aqu� est� el c�digo usado para renderizar en el BufferedImage y mostrar la imagen en la pantalla.
public void updateLocation(MouseEvent e){
rect.setLocation(last_x + e.getX(),
last_y + e.getY());
...
repaint();
...
// In the update method...
if(firstTime) {
Dimension dim = getSize();
int w = dim.width;
int h = dim.height;
area = new Rectangle(dim);
bi = (BufferedImage)createImage(w, h);
big = bi.createGraphics();
rect.setLocation(w/2-50, h/2-25);
big.setStroke(new BasicStroke(8.0f));
firstTime = false;
}
// Clears the rectangle that was previously drawn.
big.setColor(Color.white);
big.clearRect(0, 0, area.width, area.height);
// Draws and fills the newly positioned rectangle
// to the buffer.
big.setPaint(strokePolka);
big.draw(rect);
big.setPaint(fillPolka);
big.fill(rect);
// Draws the buffered image to the screen.
g2.drawImage(bi, 0, 0, this);
}