Module java.desktop
Package java.awt

Class MediaTracker

java.lang.Object
java.awt.MediaTracker
所有已实现的接口:
Serializable

public class MediaTracker extends Object implements Serializable
MediaTracker类是一个实用类,用于跟踪多个媒体对象的状态。媒体对象可以包括音频剪辑以及图像,目前仅支持图像。

要使用媒体跟踪器,需要创建一个MediaTracker实例,并为要跟踪的每个图像调用其addImage方法。此外,每个图像可以被分配一个唯一的标识符。该标识符控制图像被获取的优先顺序。它还可以用于识别可以独立等待的图像的唯一子集。具有较低ID的图像优先加载于具有较高ID编号的图像。

跟踪动画图像可能并不总是有用,因为动画图像的加载和绘制是多部分的,但是它是受支持的。当第一帧完全加载时,MediaTracker将动画图像视为完全加载。此时,MediaTracker会向任何等待的对象发出图像已完全加载的信号。如果在第一帧加载完成时没有任何ImageObserver观察图像,则图像可能会自行刷新以节省资源(参见Image.flush())。

以下是使用MediaTracker的示例:



 import java.applet.Applet;
 import java.awt.Color;
 import java.awt.Image;
 import java.awt.Graphics;
 import java.awt.MediaTracker;

 public class ImageBlaster extends Applet implements Runnable {
      MediaTracker tracker;
      Image bg;
      Image anim[] = new Image[5];
      int index;
      Thread animator;

      // 获取背景图像(id == 0)和动画帧(id == 1)的图像,并将它们添加到MediaTracker中
      public void init() {
          tracker = new MediaTracker(this);
          bg = getImage(getDocumentBase(),
                  "images/background.gif");
          tracker.addImage(bg, 0);
          for (int i = 0; i < 5; i++) {
              anim[i] = getImage(getDocumentBase(),
                      "images/anim"+i+".gif");
              tracker.addImage(anim[i], 1);
          }
      }

      // 启动动画线程
      public void start() {
          animator = new Thread(this);
          animator.start();
      }

      // 停止动画线程
      public void stop() {
          animator = null;
      }

      // 运行动画线程
      // 首先等待背景图像完全加载和绘制。然后等待所有动画帧完成加载。最后,循环并递增动画帧索引。
      public void run() {
          try {
              tracker.waitForID(0);
              tracker.waitForID(1);
          } catch (InterruptedException e) {
              return;
          }
          Thread me = Thread.currentThread();
          while (animator == me) {
              try {
                  Thread.sleep(100);
              } catch (InterruptedException e) {
                  break;
              }
              synchronized (this) {
                  index++;
                  if (index >= anim.length) {
                      index = 0;
                  }
              }
              repaint();
          }
      }

      // 背景图像填充整个框架,因此在重绘时不需要清除小程序。只需调用paint方法。
      public void update(Graphics g) {
          paint(g);
      }

      // 如果加载图像时出现任何错误,则绘制一个大红色矩形。否则始终绘制背景,以便在加载时逐步显示。最后,仅在所有帧(id == 1)完成加载时才绘制当前动画帧,以避免部分动画。
      public void paint(Graphics g) {
          if ((tracker.statusAll(false) & MediaTracker.ERRORED) != 0) {
              g.setColor(Color.red);
              g.fillRect(0, 0, size().width, size().height);
              return;
          }
          g.drawImage(bg, 0, 0, this);
          if (tracker.statusID(1, false) == MediaTracker.COMPLETE) {
              g.drawImage(anim[index], 10, 10, this);
          }
      }
 }
  

自版本:
1.0
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    表示媒体下载被中止的标志。
    static final int
    表示媒体下载成功完成的标志。
    static final int
    表示媒体下载遇到错误的标志。
    static final int
    表示媒体当前正在加载的标志。
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个媒体跟踪器来跟踪给定组件的图像。
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    addImage(Image image, int id)
    将图像添加到此媒体跟踪器正在跟踪的图像列表中。
    void
    addImage(Image image, int id, int w, int h)
    将缩放图像添加到此媒体跟踪器正在跟踪的图像列表中。
    boolean
    检查此媒体跟踪器正在跟踪的所有图像是否已完成加载。
    boolean
    checkAll(boolean load)
    检查此媒体跟踪器正在跟踪的所有图像是否已完成加载。
    boolean
    checkID(int id)
    检查此媒体跟踪器正在跟踪的具有指定标识符的所有图像是否已完成加载。
    boolean
    checkID(int id, boolean load)
    检查此媒体跟踪器正在跟踪的具有指定标识符的所有图像是否已完成加载。
    Object[]
    返回遇到错误的所有媒体的列表。
    Object[]
    getErrorsID(int id)
    返回遇到错误的具有指定ID的媒体的列表。
    boolean
    检查所有图像的错误状态。
    boolean
    isErrorID(int id)
    检查此媒体跟踪器正在跟踪的具有指定标识符的所有图像的错误状态。
    void
    removeImage(Image image)
    从此媒体跟踪器中删除指定的图像。
    void
    removeImage(Image image, int id)
    从此媒体跟踪器的指定跟踪ID中删除指定的图像。
    void
    removeImage(Image image, int id, int width, int height)
    从此媒体跟踪器中删除具有指定宽度、高度和ID的指定图像。
    int
    statusAll(boolean load)
    计算并返回由此媒体跟踪器跟踪的所有媒体的状态的按位包含OR
    int
    statusID(int id, boolean load)
    计算并返回由此媒体跟踪器跟踪的具有指定标识符的所有媒体的状态的按位包含OR
    void
    开始加载此媒体跟踪器跟踪的所有图像。
    boolean
    waitForAll(long ms)
    开始加载此媒体跟踪器跟踪的所有图像。
    void
    waitForID(int id)
    开始加载此媒体跟踪器跟踪的具有指定标识符的所有图像。
    boolean
    waitForID(int id, long ms)
    开始加载此媒体跟踪器跟踪的具有指定标识符的所有图像。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

  • Constructor Details

    • MediaTracker

      public MediaTracker(Component comp)
      创建一个媒体跟踪器来跟踪给定组件的图像。
      参数:
      comp - 最终将在其上绘制图像的组件
  • Method Details

    • addImage

      public void addImage(Image image, int id)
      将图像添加到此媒体跟踪器正在跟踪的图像列表中。该图像最终将以其默认(未缩放)大小呈现。
      参数:
      image - 要跟踪的图像
      id - 用于跟踪此图像的标识符
    • addImage

      public void addImage(Image image, int id, int w, int h)
      将缩放图像添加到此媒体跟踪器正在跟踪的图像列表中。该图像最终将以指定的宽度和高度呈现。
      参数:
      image - 要跟踪的图像
      id - 可用于跟踪此图像的标识符
      w - 图像呈现的宽度
      h - 图像呈现的高度
    • checkAll

      public boolean checkAll()
      检查此媒体跟踪器正在跟踪的所有图像是否已完成加载。

      如果图像尚未加载,则此方法不会开始加载图像。

      如果在加载或缩放图像时出现错误,则认为该图像已完成加载。使用isErrorAnyisErrorID方法检查错误。

      返回:
      true表示所有图像已完成加载、已中止或遇到错误;否则为false
      参见:
    • checkAll

      public boolean checkAll(boolean load)
      检查此媒体跟踪器正在跟踪的所有图像是否已经加载完成。

      如果load标志的值为true,则此方法开始加载尚未加载的任何图像。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      参数:
      load - 如果为true,则开始加载尚未加载的任何图像
      返回:
      如果所有图像已经加载完成、已中止或遇到错误,则返回true;否则返回false
      参见:
    • isErrorAny

      public boolean isErrorAny()
      检查所有图像的错误状态。
      返回:
      如果此媒体跟踪器跟踪的任何图像在加载过程中出现错误,则返回true;否则返回false
      参见:
    • getErrorsAny

      public Object[] getErrorsAny()
      返回遇到错误的所有媒体列表。
      返回:
      返回由此媒体跟踪器跟踪的遇到错误的媒体对象数组,如果没有错误则返回null
      参见:
    • waitForAll

      public void waitForAll() throws InterruptedException
      开始加载此媒体跟踪器跟踪的所有图像。此方法将等待所有正在跟踪的图像加载完成。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      抛出:
      InterruptedException - 如果任何线程中断了此线程
      参见:
    • waitForAll

      public boolean waitForAll(long ms) throws InterruptedException
      开始加载此媒体跟踪器跟踪的所有图像。此方法将等待所有正在跟踪的图像加载完成,或者直到ms参数指定的毫秒数已过。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      参数:
      ms - 等待加载完成的毫秒数
      返回:
      如果所有图像成功加载,则返回true;否则返回false
      抛出:
      InterruptedException - 如果任何线程中断了此线程
      参见:
    • statusAll

      public int statusAll(boolean load)
      计算并返回此媒体跟踪器跟踪的所有媒体的状态的按位包含OR

      MediaTracker类定义的可能标志包括LOADINGABORTEDERROREDCOMPLETE。尚未开始加载的图像其状态为零。

      如果load的值为true,则此方法开始加载尚未加载的任何图像。

      参数:
      load - 如果为true,则开始加载尚未加载的任何图像
      返回:
      所有正在跟踪的媒体状态的按位包含OR
      参见:
    • checkID

      public boolean checkID(int id)
      检查此媒体跟踪器正在跟踪的所有带有指定标识符的图像是否已经加载完成。

      如果图像尚未加载,则此方法不会开始加载图像。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      参数:
      id - 要检查的图像的标识符
      返回:
      如果所有图像已经加载完成、已中止或遇到错误,则返回true;否则返回false
      参见:
    • checkID

      public boolean checkID(int id, boolean load)
      检查此媒体跟踪器正在跟踪的所有带有指定标识符的图像是否已经加载完成。

      如果load标志的值为true,则此方法开始加载尚未加载的任何图像。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      参数:
      id - 要检查的图像的标识符
      load - 如果为true,则开始加载尚未加载的任何图像
      返回:
      如果所有图像已经加载完成、已中止或遇到错误,则返回true;否则返回false
      参见:
    • isErrorID

      public boolean isErrorID(int id)
      检查此媒体跟踪器跟踪的所有带有指定标识符的图像的错误状态。
      参数:
      id - 要检查的图像的标识符
      返回:
      如果带有指定标识符的任何图像在加载过程中出现错误,则返回true;否则返回false
      参见:
    • getErrorsID

      public Object[] getErrorsID(int id)
      返回遇到错误的具有指定ID的媒体列表。
      参数:
      id - 要检查的图像的标识符
      返回:
      返回由此媒体跟踪器跟踪的具有指定标识符的媒体对象数组,如果没有错误则返回null
      参见:
    • waitForID

      public void waitForID(int id) throws InterruptedException
      开始加载此媒体跟踪器跟踪的具有指定标识符的所有图像。此方法将等待具有指定标识符的所有图像加载完成。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用isErrorAnyisErrorID方法来检查错误。

      参数:
      id - 要检查的图像的标识符
      抛出:
      InterruptedException - 如果任何线程中断了此线程
      参见:
    • waitForID

      public boolean waitForID(int id, long ms) throws InterruptedException
      开始加载此媒体跟踪器跟踪的具有指定标识符的所有图像。此方法将等待具有指定标识符的所有图像加载完成,或者直到ms参数指定的毫秒数已过。

      如果在加载或缩放图像时出现错误,则认为该图像已经加载完成。使用statusIDisErrorIDisErrorAny方法来检查错误。

      参数:
      id - 要检查的图像的标识符
      ms - 等待加载完成的毫秒数
      返回:
      如果加载在指定时间内完成,则返回true;否则返回false
      抛出:
      InterruptedException - 如果任何线程中断了此线程
      参见:
    • statusID

      public int statusID(int id, boolean load)
      计算并返回此媒体跟踪器跟踪的具有指定标识符的所有媒体的状态的按位包含OR

      MediaTracker类定义的可能标志包括LOADINGABORTEDERROREDCOMPLETE。尚未开始加载的图像其状态为零。

      如果load的值为true,则此方法将开始加载尚未加载的任何图像。

      参数:
      id - 要检查的图像的标识符
      load - 如果为true,则开始加载尚未加载的任何图像
      返回:
      正在被跟踪的具有指定标识符的所有媒体的状态的按位包含OR
      另请参阅:
    • removeImage

      public void removeImage(Image image)
      从此媒体跟踪器中移除指定的图像。无论比例或ID如何,都会移除指定图像的所有实例。
      参数:
      image - 要移除的图像
      自版本:
      1.1
      另请参阅:
    • removeImage

      public void removeImage(Image image, int id)
      从此媒体跟踪器的指定跟踪ID中移除指定的图像。无论比例如何,都会移除指定ID下正在跟踪的所有Image实例。
      参数:
      image - 要移除的图像
      id - 要从中移除图像的跟踪ID
      自版本:
      1.1
      另请参阅:
    • removeImage

      public void removeImage(Image image, int id, int width, int height)
      从此媒体跟踪器中移除具有指定宽度、高度和ID的指定图像。仅移除指定实例(包括任何重复项)。
      参数:
      image - 要移除的图像
      id - 要从中移除图像的跟踪ID
      width - 要移除的宽度(-1表示未缩放)
      height - 要移除的高度(-1表示未缩放)
      自版本:
      1.1
      另请参阅: