Applets Java


En esta página:

  • Clase MediaTracker

Clase MediaTracker

Para poder controlar mejor el viaje que hacen por la red los archivos gráficos, deberemos recurrir a la clase MediaTracker. Esta clase nos permite saber cuando se han descargado los gráficos y si lo han hecho bien o con errores.

Primero crearemos un objeto:

MediaTracker tracker = new MediaTracker(this);

Este constructor toma como parámetro el componente donde se van a dibujar las imágenes. Puesto que un applet es un componente, utilizaremos this como parámetro. Dispondremos entonces de los siguientes métodos:

void tracker.addImage( Image img,int id )
Este es el método esencial, pues especifica que la imagen sea "espiada" con MediaTracker. Le asigna un número de identificación, que puede ser compartido por varias imágenes.
boolean tracker.checkAll()
boolean tracker.checkAll(boolean load)
Comprueba todas las imágenes, devolviendo false si aún no se han descargado y true en caso contrario (incluso cuando se han descargado con fallos). Si aún no ha comenzado la descarga de alguna imagen y ponemos load a true, comenzará a descargarlas en ese mismo instante.
boolean tracker.checkID(int id)
boolean tracker.checkID(int id,boolean load)
Idéntico al anterior, pero comprueba sólo las imágenes cuyo identificador sea igual a id.
void tracker.waitForAll()
Obliga al hilo actual a esperar a que se carguen todas las imágenes.
void tracker.waitForID(int id)
Obliga al hilo actual a esperar a que se carguen todas las imágenes del grupo id.
boolean tracker.isErrorAny()
Indica si se ha producido algún error en la descarga de alguna imagen.
boolean tracker.isErrorID(int id)
Indica si se ha producido algún error en la descarga de alguna imagen.

Existen más, pero en general son otras formas de hacer lo mismo. Vamos a ver un ejemplo, una animación gráfica. Para ello cargaremos cada uno de los gráficos, esperaremos a que estén disponibles, y finalmente los mostraremos:

MostrarAnimacion.java
/**
 * Applet MostrarAnimacion
 *
 * <APPLET CODE="MostrarAnimacion.class" WIDTH="56" HEIGHT="60">
 * </APPLET>
 */

import java.applet.Applet;
import java.awt.*;

public class MostrarAnimacion extends Applet implements Runnable {
  int imgActual = 0;
  Thread hilo = null;
  Image[] img;
  MediaTracker tracker;
  public void init() {
    tracker = new MediaTracker(this);
    img = new Image[18];
    for (int i=0; i<=17; i++) {
      img[i] = getImage(getDocumentBase(), "tierra" + (i+1) + ".gif");
      tracker.addImage(img[i], 0);
    }
  }
  public void start() {
    if (hilo==null) {
      hilo = new Thread(this);
      hilo.start();
    }
  }
  public void stop() {
    hilo = null;
  }
  public void paint(Graphics g) {
    if (checkAll())
      g.drawImage(img[imgActual],0,0,this);
    else {
      g.drawString("Cargando",10,10);
      g.drawString("gráficos",10,30);
    }
  }
  public void run() {
    try {
      repaint();
      tracker.waitForAll();
    }
    catch (InterruptedException e) {}
    while (hilo!=null && hilo.isAlive()) {
      imgActual++;
      if (imgActual >= img.length) imgActual = 0;
      repaint();
      try {
        hilo.sleep(50);
      }
      catch (InterruptedException e) {}
    }
  }
  public void update(Graphics g) {
    paint(g);         
  }
}

Creamos un hilo de ejecución nuevo para que nuestra animación sea fluida y suavecita. El método run(), no obstante, lo primero que hace es esperar hasta que se carguen las animaciones; paint() mientras tanto escribirá el texto "Cargando gráficos". Una vez que se hayan terminado de cargar las imágenes, el hilo se encarga de mostrar un fotograma cada 50 milisegundos.