演示MediaTracker的作用

package Assis;

//TrackedImageLoad.java主要演示MediaTracker的作用
import java.util.*;
import java.applet.*;
import java.awt.*;

/**
 * 如果面对的问题是那些正被载入的的图像只有一部分被显示, 发生这种情况是因为这个图像还没有全部载入。为了解决这个问题java提供了MediaTracker
 * 类,以跟踪多媒体对象的状态。使用它确定以个图像是否已经被完全载入,首先 必须为每一个具体的图像组件创建一个MediaTracker的实例。下面创建例子:
 * MediaTracker imageTracker = new MediaTracker(this);
 * 然后使用addImage方法将这个图像注册到imageTracker。下面是注册例子: imageTracker.addImage(anImage,
 * id); 第二个参数id是控制取图优先次序的一个整数ID。载入图像时,小ID具有较高优先。
 * 这个ID可以被用来询问imageTracker关于注册图像的状态。使用checkID方法进行 查询,ID图像全部载入返回true,否则返回false。
 * checkID(id); 使用waitForID(id)方法强迫这个程序等待这个id登记的图像被完全载入,或者
 * 可以使用waitForAll()方法等待所有已注册的图像被全部载入。下面示例将阻塞 这个程序知道图像被完全载入为止。 waitForID(int id)
 * throws InterruptedException waitForAll() throws InterruptedException
 * 
 * @author flystar
 * 
 */
public class TrackedImageLoad extends Applet implements Runnable {
	private static final long serialVersionUID = 1L;
	MediaTracker tracker;
	int tracked;
	int frame_rate = 5;// 图片显示速率
	int current_img = 0;// 当前显示的图片
	Thread motor;
	static final int MAXIMAGES = 4;// 最大图片显示数量
	Image[] img = new Image[MAXIMAGES];
	String[] name = new String[MAXIMAGES];
	boolean stopFlag;

	// 对applet进行初始化
	public void init() {
		/**
		 * 类StringTokenizer和它的静态方法hasMoreTokens对参数img进行分割, 把得到的文件名方法数组name中
		 */
		tracker = new MediaTracker(this);
		// getParameter(name)//获得html文件配置
		StringTokenizer st = new StringTokenizer("user+icon", "+");
		while (st.hasMoreTokens() && tracked < MAXIMAGES) {
			name[tracked] = st.nextToken();
			img[tracked] = getImage(getDocumentBase(), name[tracked] + ".png");
			tracker.addImage(img[tracked], tracked);
			tracked++;
		}
	}

	// paint
	public void paint(Graphics g) {
		String loaded = "";
		int donecount = 0;
		for (int i = 0; i < tracked; i++) {
			if (tracker.checkID(i, true)) {
				donecount++;
				loaded += name[i] + " ";
			}
		}
		Dimension d = getSize();
		int w = d.width;
		int h = d.height;
		if (donecount == tracked) {
			frame_rate = 1;
			Image i = img[current_img++];
			int iw = i.getWidth(null);
			int ih = i.getHeight(null);
			g.drawImage(i, (w - iw) / 2, (h - ih) / 2, null);
			if (current_img >= tracked)
				current_img = 0;
		} else {
			int x = w * donecount / tracked;
			g.setColor(Color.black);
			g.fillRect(0, h / 3, x, 16);
			g.setColor(Color.white);
			g.fillRect(x, h / 3, w - x, 16);
			g.setColor(Color.black);
			g.drawString(loaded, 10, h / 2);
		}
	}

	// start
	public void start() {
		motor = new Thread(this);
		stopFlag = false;
		motor.start();
	}

	// stop
	public void stop() {
		stopFlag = true;
	}

	// 整个程序的执行体
	public void run() {
		motor.setPriority(Thread.MIN_PRIORITY);
		while (true) {
			repaint();
			try {
				Thread.sleep(1000 / frame_rate);
			} catch (InterruptedException e) {

			}
			if (stopFlag)
				return;
		}
	}
}

 

你可能感兴趣的:(thread)