Design Pattern Java

/*
The Design Patterns Java Companion
Copyright (C) 1998, by James W. Cooper
IBM Thomas J. Watson Research Center
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Label;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ProxyDisplay extends JFrame {
  public ProxyDisplay() {
    super("Display proxied image");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    JPanel p = new JPanel();
    getContentPane().add(p);
    p.setLayout(new BorderLayout());
    ImageProxy image = new ImageProxy("elliott.jpg", 321, 271);
    p.add("Center", image);
    p.add("North", new Label("    "));
    p.add("West", new Label("  "));
    setSize(370, 350);
    setVisible(true);
  }
  
  static public void main(String[] argv) {
    new ProxyDisplay();
  }
}
//==================================
class ImageProxy extends JPanel implements Runnable {
  int height, width;
  MediaTracker tracker;
  Image img;
  JFrame frame;
  Thread imageCheck; //to monitor loading
  
  public ImageProxy(String filename, int w, int h) {
    height = h;
    width = w;
    tracker = new MediaTracker(this);
    img = Toolkit.getDefaultToolkit().getImage(filename);
    tracker.addImage(img, 0); //watch for image loading
    imageCheck = new Thread(this);
    imageCheck.start(); //start 2nd thread monitor
    //this begins actual image loading
    try {
      tracker.waitForID(0, 1);
    } catch (InterruptedException e) {
    }
  }
  
  public void paint(Graphics g) {
    if (tracker.checkID(0)) {
      height = img.getHeight(frame); //get height
      width = img.getWidth(frame); //and width
      g.setColor(Color.lightGray); //erase box
      g.fillRect(0, 0, width, height);
      g.drawImage(img, 0, 0, this); //draw loaded image
    } else {
      //draw box outlining image if not loaded yet
      g.setColor(Color.black);
      g.drawRect(1, 1, width - 2, height - 2);
    }
  }
  
  public Dimension getPreferredSize() {
    return new Dimension(width, height);
  }
  //public int getWidth() {return width;}
  //public int getHeight(){return height;}
  
  public void run() {
    //this thread monitors image loading
    //and repaints when done
    //the 1000 msec is artifically long
    //to allow demo to display with delay
    try {
      Thread.sleep(1000);
      while (!tracker.checkID(0))
        Thread.sleep(1000);
    } catch (Exception e) {
    }
    repaint();
  }
}