Se puede hablar de dos tipos:
- Animacion de tipo ‘dibujos animados’: presentar una sucesion rapida de imagenes precargadas GIF o JPEG (p205 21days)
- Animacion dibujada en tiempo real; veamos
- Un ejemplo que NO funciona (no aparece nada en pantalla);
MalRelojDigitalApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
public class MalRelojDigitalApplet extends java.applet.Applet
{
Font fuente = new Font("TimesRoman", Font.BOLD, 24);
Date fecha;
public void start()
{
while (true)
{
fecha = new Date();
repaint();
try
{
Thread.sleep(10000);
} catch(InterruptedException e)
{;}
}
}
public void paint(Graphics g)
{
g.setFont(fuente);
g.drawString(fecha.toString(), 10, 50);
}
}
- ¿Porqué no funciona?: paint nunca se ejecuta ya que el bucle while monopoliza la ejecucion.
- Cómo debe hacerse para que funcione: usando Threads
Ej:
BienRelojDigitalApplet.java
import java.awt.Graphics;
import java.awt.Font;
import java.util.Date;
public class BienRelojDigitalApplet extends java.applet.Applet implements Runnable
cambio
{
Font fuente = new Font("TimesRoman", Font.BOLD, 24);
Date fecha;
Thread runner; cambio
cambio
public void start()
{
if (runner null)
{
runner = new Thread(this);
runner.start();
}
else
{
System.out.println("Stop");
}
}
cambio
public void stop()
{
if (runner != null)
{
runner.stop();
runner = null;
}
else
{
System.out.println("Stop");
}
}
cambio
public void run()
{
while (true)
{
fecha = new Date();
repaint();
try
{
Thread.sleep(1000);
} catch(InterruptedException e)
{;}
}
}
public void paint(Graphics g)
{
{
g.setFont(fuente);
g.drawString(fecha.toString(), 10, 50);
}
}
}
- El problema del parpadeo: el programa anterior funciona, pero se aprecia un parpadeo molesto cada 3 o 4 segundos
- Porqué aparece parpadeo:
- (las imagenes son demasiado grandes. Con pequeños cuadros es inapreciable el parpadeo)
- repaint() llama al metodo update()
- update() borra la pantalla por completo y la rellena con el color de fondo. Despues llama a paint()
public void update(Graphics g)
{
g.setColor(getBackground());
g.fillRect(0,0,width,height);
g.setColor(getForeground());
paint(g);
}
- paint() escribe el nuevo pantallazo
- Es la llamada a update() la que produce el parpadeo.
- Soluciones posibles
- Sobreescribir update() para que no borre la pantalla o que solo borre una cierta area
- Clipping: re-dibujar solo aquello que cambia. Metodo clipRect() de la clase Graphics
- Doble-buffering: hacer los cambios en una pantalla ‘virtual’ y volcar el resultado a la pantalla ‘real’ (p212 21days). Es el metodo mas complicado...