加载网络图片
当图片没有加载好时,提示文字信息,加载完毕,显示图片
模型设计
- 蓝色为代理模式
- 橘红色为状态模式
对应代码
package headfirst.hd.proxy.eg;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JComponent;
class ImageComponent extends JComponent {
private static final long serialVersionUID = 1L;
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);
}
}
package headfirst.hd.proxy.eg;
import java.awt.Component;
import java.awt.Graphics;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
class ImageProxy implements Icon {
private ImageIcon imageIcon;
private URL imageURL;
private ImageIconState notNullState = new NotNullState(this);
private ImageIconState nullState = new NullState(this);
private ImageIconState state = nullState;
public void changeState() {
state = notNullState;
}
public ImageProxy(URL url) {
imageURL = url;
}
public ImageIcon getImageIcon() {
return imageIcon;
}
public void setImageIcon(ImageIcon imageIcon) {
this.imageIcon = imageIcon;
}
public URL getImageURL() {
return imageURL;
}
public int getIconWidth() {
return state.getIconWidth();
}
public int getIconHeight() {
return state.getIconHeight();
}
public void paintIcon(final Component c, Graphics g, int x, int y) {
state.paintIcon(c, g, x, y);
}
}
package headfirst.hd.proxy.eg;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.JFrame;
public class ImageProxyDriveTest
{
ImageComponent imageComponent;
JFrame frame = new JFrame("CD 专辑");
public static void main(String[] args) throws Exception
{
new ImageProxyDriveTest();
}
public ImageProxyDriveTest() throws Exception
{
URL initialURL = new URL("https://avatar.csdn.net/D/9/4/1_dengjili.jpg?1522415431");
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);
}
}
package headfirst.hd.proxy.eg;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public abstract class ImageIconState {
protected ImageProxy imageProxy;
public ImageIconState(ImageProxy imageProxy) {
this.imageProxy = imageProxy;
}
protected ImageIcon getImageIcon() {
return imageProxy.getImageIcon();
}
public abstract int getIconWidth();
public abstract int getIconHeight();
public abstract void paintIcon(final Component c, Graphics g, int x, int y);
}
package headfirst.hd.proxy.eg;
import java.awt.Component;
import java.awt.Graphics;
public class NotNullState extends ImageIconState {
public NotNullState(ImageProxy imageProxy) {
super(imageProxy);
}
@Override
public int getIconWidth() {
return getImageIcon().getIconWidth();
}
@Override
public int getIconHeight() {
return getImageIcon().getIconHeight();
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
getImageIcon().paintIcon(c, g, x, y);
}
}
package headfirst.hd.proxy.eg;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class NullState extends ImageIconState {
private Thread retrievalThread;
private boolean retrieving = false;
public NullState(ImageProxy imageProxy) {
super(imageProxy);
}
@Override
public int getIconWidth() {
return 800;
}
@Override
public int getIconHeight() {
return 600;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.drawString("正在加载图片,请稍等。。。", x+300, y+190);
if (!retrieving) {
retrieving = true;
retrievalThread = new Thread(new Runnable() {
public void run() {
try {
//延迟三秒加载,模拟网络很慢的时候
Thread.sleep(3000);
imageProxy.setImageIcon( new ImageIcon(imageProxy.getImageURL(), "CD 图片"));
imageProxy.changeState();
c.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
});
retrievalThread.start();
}
}
}
测试结果
加载图片前
加载图片后