利用SwingWorker异步加载图片

参考自:http://www.oschina.net/code/snippet_12_82#113

基本思路:

  1. 通过SwingWorker来异步获取图片并创建ImageIcon;
  2. 通过JLabel的设置Icon的方式来显示获取的图片。

实例代码如下:

 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.imageio.ImageIO;

public class ImageLoaderDemo extends JFrame {
 private JTextArea log;
 private JPanel viewer;

 public ImageLoaderDemo() {
  super("Image Loader");
  this.log = new JTextArea(4, 4);
  this.viewer = new JPanel();
  JButton start = new JButton("Start");
  start.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    String[] files = new String[] {
      "http://cdqxx.img44.wal8.com/img44/521141_20150617214704/143459309389.jpg",
      "C:\\Users\\TS\\Desktop\\test1.PNG",
      "C:\\Users\\TS\\Desktop\\test2.PNG",
      "C:\\Users\\TS\\Desktop\\test3.PNG" };
    new ImageLoadingWorker(log, viewer, files).execute();
   }
  });
  add(new JScrollPane(log), BorderLayout.NORTH);
  add(new JScrollPane(viewer), BorderLayout.CENTER);
  add(start, BorderLayout.SOUTH);
  setSize(600, 600);
 }

 public static void main(String... args) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    new ImageLoaderDemo().setVisible(true);
   }
  });
 }

}

class ImageLoadingWorker extends SwingWorker<List<ImageIcon>, String> {
 private JTextArea log;
 private JPanel viewer;
 private String[] filenames;

 public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
  this.log = log;
  this.viewer = viewer;
  viewer.setLayout(new GridLayout(0,2,5,5));
  this.filenames = filenames;
 }

 @Override
 protected void done() {
  System.out.println("done()");
  
  viewer.removeAll();
  try {
   for (ImageIcon image : get()) {
    JLabel jl = new JLabel(image);
    viewer.add(jl);
    viewer.revalidate();
   }
  } catch (Exception e) {
  }
 }

 @Override
 protected void process(List<String> messages) {
  System.out.println("process()");

  for (String message : messages) {
   log.append(message);
   log.append("\n");
  }
 }

 @Override
 public List<ImageIcon> doInBackground() {
  System.out.println("doInBackground()");
  
  List<ImageIcon> images = new ArrayList<ImageIcon>();
  int width = 400;
  int height = 400;
  for (String filename : filenames) {
   ImageIcon ii = new ImageIcon();

   try {
    if(filename.startsWith("http")){
     ii.setImage(new ImageIcon(new URL(filename)).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
    }else{
     ii.setImage(new ImageIcon(ImageIO.read(new File(filename))).getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
    }
    images.add(ii);
    publish("Loaded " + filename);
   } catch (IOException ioe) {
    publish("Error loading " + filename);
   }
  }
  return images;
 }
}

 

注:测试时注意修改本地图片的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值