参考自: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;
}
}
注:测试时注意修改本地图片的地址。