JComponents desaparecendo depois de chamar mouseClicked ()

Eu estou escrevendo um programa GUI Java com Swing. A interface é assim:

programa

Quando o usuário clica em uma das imagens do lado direito, quero que uma pequena visualização dele apareça na área laranja no canto superior esquerdo. Eu puxo todos os arquivos de imagem de um diretório no meu computador através de um segmento SwingWorker . No método done () do SwingWorker, adiciono um ouvinte mouseClicked a cada object (um object TaggableImage de uma class que criei. Ele tem um BufferedImage e estende JComponent, substituindo o método paintComponent () ). Dentro do ouvinte mouseClicked, eu chamo o método add () do painel laranja e transmito o TaggableImage.

Minha pergunta:

Quando clico em uma das imagens, ela não é adicionada ao painel laranja e desaparece do painel à direita. Se eu clicar em todas as imagens, ficarei com um painel direito em branco. Por que isso acontece?

Aqui está todo o meu segmento SwingWorker:

SwingWorker<ArrayList, Void> loadImagesAsyncWorker = new SwingWorker<ArrayList, Void>() { ArrayList img_list = new ArrayList(); @Override protected ArrayList 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); }); } } }; 

E aqui está a minha class TaggableImage:

 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); } } 

Considere usar um JList no painel direito para aproveitar as opções flexíveis de layout e o tratamento de seleção, como mostrado aqui e abaixo.

insira a descrição da imagem aqui

 import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @see https://stackoverflow.com/a/25170471/230513 */ public class ListDisplayPanel { private static final Icon icon = UIManager.getIcon("html.pendingImage"); private ListPanel listPanel = new ListPanel(); private DisplayPanel displayPanel = new DisplayPanel(); private class DisplayPanel extends JPanel { private static final int SIZE = 256; private JLabel label = new JLabel(); public DisplayPanel() { this.add(label); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D temp = (Graphics2D) img.getGraphics(); icon.paintIcon(this, temp, 0, 0); temp.dispose(); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawImage(img, 0, 0, getWidth(), getHeight(), this); } @Override public Dimension getPreferredSize() { return new Dimension(SIZE, SIZE); } } private class ListPanel extends JPanel { private static final int N = 5; private DefaultListModel dlm = new DefaultListModel(); private JList list = new JList(dlm); public ListPanel() { super(new GridLayout()); for (int i = 0; i < N * N; i++) { String name = "Cell-" + String.format("%02d", i); dlm.addElement(name); } list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setLayoutOrientation(JList.HORIZONTAL_WRAP); list.setVisibleRowCount(N); list.setCellRenderer(new ListRenderer()); list.addListSelectionListener(new SelectionHandler()); this.add(list); } private class ListRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); label.setIcon(icon); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); return label; } } private class SelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { displayPanel.label.setText((String) dlm.getElementAt(e.getLastIndex())); } } } } private void display() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JSplitPane jsp = new JSplitPane(); jsp.setRightComponent(new JScrollPane(listPanel)); jsp.setLeftComponent(displayPanel); f.add(jsp); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(() -> { new ListDisplayPanel().display(); }); } }