Mega Code Archive

 
Categories / Java / Design Pattern
 

Proxy pattern in 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();   } }