I am writing a Java GUI program with Swing. The interface looks like this:
When the user clicks on one of the pictures on the right hand side, I want a small preview of it to show up in the orange area in the upper left corner. I pull all of the image files from a directory on my computer via a SwingWorker thread. In the SwingWorker's done() method, I add a mouseClicked listener to each object (a TaggableImage object from a class I created. It has a BufferedImage and extends JComponent, overriding the paintComponent() method). Within the mouseClicked listener, I call the orange panel's add() method and pass it the TaggableImage.
My Question:
When I click on one of the images, it does not get added to the orange panel, and it disappears from the panel on the right side. If I click all of the images, I will be left with a blank right panel. Why does this happen?
Here is my entire SwingWorker thread:
SwingWorker<ArrayList<TaggableImage>, Void> loadImagesAsyncWorker = new SwingWorker<ArrayList<TaggableImage>, Void>() {
ArrayList<TaggableImage> img_list = new ArrayList<TaggableImage>();
@Override
protected ArrayList<TaggableImage> doInBackground() throws Exception {
File currentDirectory = new File(".");
getFileInDirectory(currentDirectory);
return null;
}
// recursively get all files in this directory and child directories
private void getFileInDirectory(File cd) {
File[] file_list = cd.listFiles();
for (File f : file_list) {
if (f.isDirectory()) {
getFileInDirectory(f);
} else if (f.isFile()) {
BufferedImage bf = null;
String extension = "";
int i = f.getName().lastIndexOf('.');
int p = Math.max(f.getName().lastIndexOf('/'), f.getName()
.lastIndexOf('\\'));
if (i > p) {
extension = f.getName().substring(i + 1);
}
System.out.println(f.getName());
if (extension.equals("jpg")) {
try {
bf = ImageIO.read(f);
TaggableImage ti = new TaggableImage(bf);
img_list.add(ti);
} catch (IOException e) {
}
}
}
}
}
public void done() {
for (TaggableImage ti : img_list) {
final TaggableImage final_ti = ti;
ti.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
final_ti.setMaximumSize(new Dimension(30, 30));
BorderLayout layout = (BorderLayout) getContentPane()
.getLayout();
if (layout.getLayoutComponent(BorderLayout.CENTER) != null) {
img_prev_panel.remove(layout
.getLayoutComponent(BorderLayout.CENTER));
}
//img_prev_panel = the orange panel
img_prev_panel.add(final_ti, BorderLayout.CENTER);
});
}
}
};
And here is my TaggableImage class:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import javax.swing.JComponent;
public class TaggableImage extends JComponent {
private static final long serialVersionUID = 1L;
private BufferedImage bufferedImage;
private int height;
private int width;
public TaggableImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
}
public TaggableImage(BufferedImage bufferedImage, int width, int height) {
this.bufferedImage = bufferedImage;
this.width = width;
this.height = height;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bufferedImage, 0, 0, null);
}
}