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.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.imageio.ImageIO;
import org.jdesktop.swingworker.SwingWorker;
public class ImageLoader extends JFrame {
private JTextArea log;
private JPanel viewer;
public ImageLoader() {
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[] {
"Bodie_small.png", "Carmela_small.png",
"Death Valley_small.png", "Lake_small.png"
};
new ImageLoadingWorker(log, viewer, files).execute();
}
});
add(new JScrollPane(log), BorderLayout.NORTH);
add(new JScrollPane(viewer), BorderLayout.CENTER);
add(start, BorderLayout.SOUTH);
setSize(360, 280);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageLoader().setVisible(true);
}
});
}
}
// Final result is a list of Image
// Intermediate result is a message as a String
class ImageLoadingWorker extends SwingWorker<List<Image>, String> {
private JTextArea log;
private JPanel viewer;
private String[] filenames;
public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
this.log = log;
this.viewer = viewer;
this.filenames = filenames;
}
// In the EDT
@Override
protected void done() {
try {
for (Image image : get()) {
viewer.add(new JLabel(new ImageIcon(image)));
viewer.revalidate();
}
} catch (Exception e) { }
}
// In the EDT
@Override
protected void process(String... messages) {
for (String message : messages) {
log.append(message);
log.append("\n");
}
}
// In a thread
@Override
public List<Image> doInBackground() {
List<Image> images = new ArrayList<Image>();
for (String filename : filenames) {
try {
images.add(ImageIO.read(new File("./build/"+filename)));
publish("Loaded " + filename);
} catch (IOException ioe) {
publish("Error loading " + filename);
}
}
return images;
}
}
|