/* 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(); } } |