您的位置:首页 > 其它

利用SwingWorker异步加载图片

2015-07-26 17:28 281 查看
参考自:http://www.oschina.net/code/snippet_12_82#113

基本思路:

通过SwingWorker来异步获取图片并创建ImageIcon;
通过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;

 }

}

 

注:测试时注意修改本地图片的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息