一、问题描述

当我们在网络上加载一些图像时,限于连接宽带和网络负载,下载可能需要一些时间,所以在等待图像加载的时候,就应该显示一些东西。我们也不希望在等待图像时,整个应用程序被挂起。一旦图像加载完成,刚才显示的东西就应该消失,图像显示出来。

二、类图

三、实现代码

1.ImageComponent

class ImageComponent extends JComponent {private Icon icon;public ImageComponent(Icon icon) {this.icon = icon;}public void setIcon(Icon icon) {this.icon = icon;}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);}
}

2.代理类ImageProxy

class ImageProxy implements Icon {ImageIcon imageIcon;URL imageURL;Thread retrievalThread;boolean retrieving = false;public ImageProxy(URL url) { imageURL = url; }public int getIconWidth() {if (imageIcon != null) {return imageIcon.getIconWidth();} else {return 800;}}public int getIconHeight() {if (imageIcon != null) {return imageIcon.getIconHeight();} else {return 600;}}public void paintIcon(final Component c, Graphics  g, int x,  int y) {if (imageIcon != null) {imageIcon.paintIcon(c, g, x, y);} else {g.drawString("Loading CD cover, please wait...", x+300, y+190);if (!retrieving) {retrieving = true;retrievalThread = new Thread(new Runnable() {public void run() {try {imageIcon = new ImageIcon(imageURL, "CD Cover");c.repaint();} catch (Exception e) {e.printStackTrace();}}});retrievalThread.start();}}}
}

3.测试

public class ImageProxyTestDrive
{ImageComponent imageComponent;JFrame frame = new JFrame("CD Cover Viewer");JMenuBar menuBar;JMenu menu;Hashtable cds = new Hashtable();public static void main(String[] args) throws Exception{ImageProxyTestDrive testDrive = new ImageProxyTestDrive();}public ImageProxyTestDrive() throws Exception{cds.put("Ambient: Music for Airports","http://images.amazon.com/images/P/B000003S2K.01.LZZZZZZZ.jpg");cds.put("Buddha Bar","http://images.amazon.com/images/P/B00009XBYK.01.LZZZZZZZ.jpg");cds.put("Ima","http://images.amazon.com/images/P/B000005IRM.01.LZZZZZZZ.jpg");cds.put("Karma","http://images.amazon.com/images/P/B000005DCB.01.LZZZZZZZ.gif");cds.put("MCMXC A.D.","http://images.amazon.com/images/P/B000002URV.01.LZZZZZZZ.jpg");cds.put("Northern Exposure","http://images.amazon.com/images/P/B000003SFN.01.LZZZZZZZ.jpg");cds.put("Selected Ambient Works, Vol. 2","http://images.amazon.com/images/P/B000002MNZ.01.LZZZZZZZ.jpg");URL initialURL = new URL((String) cds.get("Selected Ambient Works, Vol. 2"));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){imageComponent.setIcon(new ImageProxy(getCDUrl(event.getActionCommand())));frame.repaint();}});}//建立框架和菜单Icon icon = new ImageProxy(initialURL);imageComponent = new ImageComponent(icon);frame.getContentPane().add(imageComponent);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;}}
}

运行窗口:

(加载图片时显示"Loading CD cover, please wait...",反应太快,就不截图了)

转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8974694

代理模式(Proxy Pattern)(四):HeadFirst中CD封面虚拟代理相关推荐

  1. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...

  2. 设计模式-代理模式(Proxy Pattern)

    设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...

  3. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  4. 设计模式——代理模式(Proxy Pattern)之为别人做嫁衣

    代理模式Proxy Pattern 代理模式 1.背景 2.定义 3.特征 4.应用场景 5.实验案例 参考 代理模式 1.背景 假如说我现在想租一间房子,虽然我可以自己去找房源,做卫生检测等一系列的 ...

  5. 设计模式(结构型)之代理模式(Proxy Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  6. 代理模式-Proxy Pattern

    在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象.例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买.又如 ...

  7. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  8. 代理模式(Proxy Pattern)

    设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) C#设计模式(13)-Proxy Pattern 一. 代理(Proxy)模式 代理(Proxy)模式给某一个对 ...

  9. 27代理模式(Proxy Pattern)

    直接与间接:    人们对复杂的软件系统常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活. 满足特定需求的解决方案.                                    ...

最新文章

  1. 贪心 双指针----Codeforces Round #727 (Div.2) D. PriceFixed
  2. swift_002(Swift的String的基本使用)
  3. 【转】Android Studio系列教程一--下载与安装
  4. maven jar包冲突的发现与解决[工具篇]
  5. Jackson用法详解
  6. KVM热迁移方式漫谈
  7. Tomcat新版本旧版本下载(Windows和Linux)
  8. 51nod 1050循环数组最大字段和
  9. Linux 上最好的视频编辑软件
  10. SAS安装时出现的问题:Diagram Control
  11. 跨境电商独立站海外引流渠道:Quora运营技巧
  12. 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
  13. 当使用VMware给虚拟机扩展硬盘容量时,显示无法扩展容量并提示:在部分链上无法执行所调用的函数,请打开父虚拟磁盘。
  14. 《UEFI内核导读》全集,2023年更新
  15. OpenCV项目1-OCR识别
  16. C# 终本案件、综合执行人、裁判文书爬虫
  17. 如何恢复小强中被修改的软件包
  18. Leetcode 1675. Minimize Deviation in Array [Python]
  19. 7行代码制作一个超声波测距仪
  20. Unity中使用代码将预制加载到场景

热门文章

  1. 智慧园区三维可视化IOC数字孪生系统
  2. 日常自写的小脚本 一
  3. 突触作为神经元的输入
  4. 百度站长平台使用教程:闭站保护
  5. 带谷歌搜索功能的搜索镜像地址集
  6. 电脑上的视频声音怎么提取出来?
  7. 前端保留两位有效数字_js保留两位小数方法总结
  8. GGS校园超市购物系统
  9. 宝塔面板上行下行,总发送总接收是什么意思?
  10. 6种Maven依赖变红的解决方案