import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Hashtable;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
* 代理模式
* 为另一个对象提供一个替身或占为符以访问这个对象.
*/

public class ProxyPattern {

     public static void main(String[] args) {
   try {
      ImageProxyTestDrive p_w_picpathProxyTestDrive = new ImageProxyTestDrive();
  } catch (Exception e) {
      e.printStackTrace();
  }
    }

}
//Icon是javax.swing的一个接口类,ImageIcon也是javax.swing中实现Icon的类
//ImageProxy代理实现Icon接口类的方法.
class ImageProxy implements Icon{
    ImageIcon p_w_picpathIcon;
    URL p_w_picpathURL;
    Thread retrievalThread;
     boolean retrieving = false;
  
     public ImageProxy(URL url) {
  p_w_picpathURL = url;
    }
  
     public int getIconWidth() {
   if (p_w_picpathIcon != null) {
       return p_w_picpathIcon.getIconWidth();
  } else {
       return 800;
  }
    }
  
     public int getIconHeight() {
   if (p_w_picpathIcon != null) {
       return p_w_picpathIcon.getIconHeight();  
  } else {
       return 600;
  }
    }
  
     public void paintIcon( final Component c,Graphics g, int x, int y) {
   if (p_w_picpathIcon != null) {
      p_w_picpathIcon.paintIcon(c, g, x, y);
  } else {
      g.drawString( "Loading CD cover,please wait...", x+300, y+300);
       if (!retrieving) {
    retrieving = true;
    
    retrievalThread = new Thread( new Runnable(){
         public void run() {
       try{
          p_w_picpathIcon = new ImageIcon(p_w_picpathURL, "CD Cover");
          c.repaint();
      } catch(Exception e){
          e.printStackTrace();
      }
        }
    });
    retrievalThread.start();
      }
  }
    }
}

//存放Icon的容器
class ImageComponent extends JComponent{
     private Icon icon;
  
     public ImageComponent(Icon icon) {
   this.icon = icon;
    }
  
     public void setIcon(Icon iocn) {
   this.icon = iocn;
    }
  
     public void paintComponent(Graphics g) {
   super.paintComponent(g);
   int w = icon.getIconWidth();
   int h = icon.getIconHeight();
   int x = (800 - w)/2;
   int y = (600 - h)/2;
  icon.paintIcon( this, g, x, y);
    }
}

//窗口类
class ImageProxyTestDrive{
    ImageComponent p_w_picpathComponent;
    JFrame frame = new JFrame( "CD Cover Viewer");
    JMenuBar menuBar;
    JMenu menu;
    Hashtable cds = new Hashtable();
  
     public ImageProxyTestDrive() throws Exception {
   //有需要的话可以添加更多的选项
  cds.put( "1", "http://p_w_picpaths.amazon.com/p_w_picpaths/P/B000003SFN.01.LZZZZZZZ.jpg");
  
  URL initialURL = new URL((String)cds.get("1"));
  menuBar = new JMenuBar();
  menu = new JMenu("Favorite CDs");
  menuBar.add(menu);
  frame.setJMenuBar(menuBar);
  
  for (Enumeration e = cds.keys();e.hasMoreElements();) {
      String name = (String)e.nextElement();
      JMenuItem menuItem = new JMenuItem(name);
      menu.add(menuItem);
      menuItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent event) {
        p_w_picpathComponent.setIcon(new ImageProxy(getCDUrl(event.getActionCommand())));
        frame.repaint();
    }
      });
  }
  
  //从这里可以看出ImageProxy是如何代理生成Icon的
  Icon icon = new ImageProxy(initialURL);
  
  p_w_picpathComponent = new ImageComponent(icon);
  frame.getContentPane().add(p_w_picpathComponent);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(800,600);
  frame.setVisible(true);
    }
  
    URL getCDUrl(String name){
  try {
      return new URL((String)cds.get(name));
  } catch (MalformedURLException e) {
      e.printStackTrace();
      return null;
  }
    }
}