Gráficos con Java 2D

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.

Pulsa sobre la imagen para ejecutar el  applet.

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);
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO