代理模式-虚拟代理(image)

package M_Proxy.image;

import java.awt.Component;
import java.awt.Graphics;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;

/**
* 设计CD封面虚拟代理
* 1:imageProxy创建imageIcon,开始从网上加载图片
* 2:加载过程中,imageProxy显示CD加载中
* 3:图像加载完毕,imageProxy把所有方法委托给真正的imageIcon对象
* 4:用户请求新的图片,就创建新的代理,重复过程
*/
public class ImageProxy implements Icon {
ImageIcon imageIcon;
URL imageURL;
Thread retrievalThread;
boolean retrieving = false;

public ImageProxy(URL imageURL) {
    this.imageURL = imageURL;
}

// 可以用状态模式优化
public int getIconWidth() {
    if (imageIcon != null) {
        return imageIcon.getIconWidth();
    } else
        return 800;
}

// 可以用状态模式优化
public int getIconHeight() {
    if (imageIcon != null) {
        return imageIcon.getIconHeight();
    } else {
        return 600;
    }
}

@Override
public void paintIcon(final Component c, Graphics g, int x, int y) {
    if (imageIcon != null)
        imageIcon.paintIcon(c, g, x, y);
    else {
        g.drawString("正在加载请等待", x + 300, y + 190);
        // 如果没有取出图片
        if (!retrieving) {
            retrieving = true;
            // 加载图片同步的话,会耗在这里,不能进行其他操作,所以采用多开线程异步加载图片
            retrievalThread = new Thread(new Runnable() {
                public void run() {
                    try {
                        // 构造器会在图片加载完后才返回
                        imageIcon = new ImageIcon(imageURL, "CD Conver");
                        // 图像加载好后,重绘
                        c.repaint();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            retrievalThread.start();
        }
    }
}

}
package M_Proxy.image;

import java.awt.Graphics;

import javax.swing.Icon;
import javax.swing.JComponent;

public class ImageComponent extends JComponent {
private Icon icon;

public ImageComponent(Icon icon) {
    this.icon = icon;
}

public void setIcon(Icon icon) {
    this.icon = icon;
}

@Override
protected 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);
}

}
package M_Proxy.image;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class ImageProxyTestDrive {
ImageComponent imageComponent;
JFrame frame = new JFrame(“CD Conver Viewer”);
JMenuBar menuBar;
JMenu menu;
Hashtable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值