Pergunta

Como eliminar o flicker de applets ou aplicações?

Resposta

A eliminação do flicker em applets e aplicações pode ser obtida através de uma estratégia bastante simples: ao invés de realizar o trabalho de renderização diretamente no contexto gráfico recebido pela applet ou aplicação (tipicamente no método paint), efetua-se a renderização numa imagem offscreen (em memória) transferindo-a de uma só vez através do método update, que usualmente não é sobreposto (overrided) pelas applets e aplicações. Esta estratégia elimina completamente o flicker.

Sua implementação em aplicações existentes é bastante simples:

  1. Adicione os seguintes campos a classe que realiza a renderização:
private Image offScreenImage;
private Dimension offScreenSize;
private Graphics offScreenGraphics;
  1. Implemente o método update como indicado abaixo, o que não requer outras modificações na aplicação ou applet.
public final synchronized void update (Graphics g) {
  Dimension d = getSize();
  if((offScreenImage == null) ||
     (d.width != offScreenSize.width) ||
     (d.height != offScreenSize.height)) {
    offScreenImage = createImage(d.width, d.height);
    offScreenSize = d;
    offScreenGraphics = offScreenImage.getGraphics();
  }
  offScreenGraphics.clearRect(0, 0, d.width, d.height);
  paint(offScreenGraphics);
  g.drawImage(offScreenImage, 0, 0, null);
}

Outra forma de realizar esta tarefa é implementar a renderização diretamente no método update mas sempre efetuando-a na imagem offscreen.