Utilizando Doble Buffer en JFrame mediante BufferStrategy
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






