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; } } }