加载耗时资源代码实现

加载网络图片

当图片没有加载好时,提示文字信息,加载完毕,显示图片

这里写图片描述

模型设计

这里写图片描述

  • 蓝色为代理模式
  • 橘红色为状态模式

对应代码

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

}

测试结果

加载图片前
这里写图片描述
加载图片后
这里写图片描述

猜你喜欢

转载自blog.csdn.net/dengjili/article/details/79764204