El AWT pide que se redibuje llamando al método update() del componente. La implementación por defecto de update() limpia el fondo del componente antes de llamar al método paint(). Cómo eliminar el parpadeo requiere que elimine todo el dibujo innecesario, su primer paso siempre es sobreescribir el método update() para que borre todo el fondo sólo cuando sea necesario. Cuando mueva el código de dibujo del método paint() al método update(), podría necesitar modificar el código de dibujo, para que no dependa de si el fondo ha sido borrado.
Nota: Incluso si su implementación de update() no llama a paint(), debe implementar este método. La razón: Cuando un área de un componente se revela de repente después de hacer estado oculta (detrás de alguna otra ventana, por ejemplo), el AWT llama directamente al método paint(), sin llamar a update(). Una forma sencilla de implementar el método paint() es hacer una llamada a update().
Aquí tienes el código de una versión modificada del ejemplo anterior que implementa update() para eliminar el parpadeo. Aquí tienes el applet en acción:
Aquí tienes la nueva versión del método paint(), junto con el nuevo método update(). Todo el código de dibujo que era utilizado por el método paint() está ahora en el método update(). Los cambios significantes en el código de dibujo están en negrita.
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
Color bg = getBackground();
Color fg = getForeground();
...//igual que el viejo método paint() hasta que dibujamos el rectángulo:
if (fillSquare) {
g.fillRect(x, y, w, h);
fillSquare = false;
} else {
g.setColor(bg);
g.fillRect(x, y, w, h);
g.setColor(fg);
fillSquare = true;
}
...//igual que el viejo método paint()
}
Observa que ya que no se limpia automáticamente el fondo, el código de dibujo debe ahora dibujar los rectángulos que no sean negros, así como los que lo sean.
Una técnica que se podría utilizar en el método update() es recortar su área de dibujo. Esto no funciona para el applet de ejemplo de esta página, ya que en cada marco cambia todo el área de dibujo. El recortado funciona bien, aunque, sólo cuando cambia una pequeña parte del área de dibujo -- como cuando el usuario arrastra un objeto a lo largo de la pantalla.Puede realizar el recortado utilizando el método clipRect(). Un ejemplo de utilización de clipRect() se encuentra en la página Aumentar el Rendimiento y la Aperiencia de una Animación.