Utilizando Doble Buffer en JFrame mediante BufferStrategy

Posted on Febrero 27, 2008. Filed under: JFrame, Java, Swing | Tags: , , , |

Muchas veces queremos dibujar (gráficos, mapas, imagenes, etc) sobre un JFrame (generalmente reimplementando
paint(Graphics g)) y si estos son dinámicos podemos llegar a notar que el Frame parpadeá.

Ante esta situación notamos que necesitamos utilizar una técnica de Doble Buffering de forma de evitar estos inconvenientes, y poder realizar y obtener los mismo resultados que con un JPanel (que ya tiene implementado y activado el doble buffer por defecto).

Para ello utilizamos la clase java.awt.image.BufferStrategy.

Por ejemplo si tenemos implementado algo como:


...
import java.awt.Graphics2D;
...

public class SinDBufferJFrame extends javax.swing.JFrame
    ...

    public SinDBufferJFrame () {
        ...
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = null;

        try {
            g2 = g.create();

            paint(g2);
        } finally {
            g2.dispose();
        }
    }

    public void paint(Graphics2D g2) {
        ...
        //Acá dibujamos lo que queremos mostrar
        ...
    }

    ...
}

podemos modificar rápidamente nuestro JFrame para utilizar Doble Buffer de la siguiente forma:


...
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
...

public class DBufferJFrame extends javax.swing.JFrame

    ...
    private final BufferStrategy bf;
    ...

    public DBufferJFrame () {
        ...

        createBufferStrategy(2);        //creamos dos buffers
        bf = this.getBufferStrategy();  //obtenemos la estrategia del JFrame
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = null;

        try {
            //obtenemos uno de los buffers para dibujar
            g2 = (Graphics2D) bf.getDrawGraphics();

            paint(g2);
        } finally {
            g2.dispose();
        }

        //pintamos el buffer en pantalla
        bf.show();
    }

    public void paint(Graphics2D g2) {
        ...
        //Acá dibujamos lo que queremos mostrar
        ...
    }

    ...
}

Espero les sirva.
Saludos.

Más Info

Make a Comment

Make A Comment: ( None so far )

blockquote and a tags work here.

Liked it here?
Why not try sites on the blogroll...