E' possibile. Faccio un caso generico che comprende qualsiasi JComponent.
Primo: implementare DefaultTableCellRenderer(per visualizzare il componente)
codice:
import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class PanelRender extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(value instanceof JComponent) {
return (JComponent)value;
} else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
Secondo: implemenatere TableCellEditor(per intercettare l'editing e passare il click al Jcomponent)
codice:
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
public class PanelEditor extends AbstractCellEditor implements TableCellEditor {
private JComponent panel = null;
public Object getCellEditorValue() {
return panel;
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
panel = (JComponent)value;
return panel;
}
}
A questo punto hai tutti gli strumenti. Faccio un esempio per spiegarti il funzionamento.
codice:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class NewClass {
public static void main(String[] args) {
//Creo due JComponent, in questo caso bottoni dove potresti inserire l'immagine
JButton button = new JButton("Qua ci metti l'img");
JButton button2 = new JButton("Qua ci metti l'img");
//Aggiungo dei listener ai bottoni, al loro interno andra' il codice per la rimozione
button.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Simo");
}
} );
button2.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Simo2");
}
} );
//Valori delle celle. Notare: passo anche i bottoni nella terza colonna
Object[][] tableData = {
{ "1", "2", button },
{ "3", "4", button2 },
};
//Nomi delle colonne
Object[] tableHeaders = {"A", "B", "Cancella"};
// Creo il modello della tabella e l'applico ad un istanza di Jtable
TableModel tableModel = new DefaultTableModel(tableData, tableHeaders);
JTable table = new JTable();
table.setModel(tableModel);
// Alla terza colonna,identificata per nome, applico l'editor e il render personalizzati.
table.getColumn("Cancella").setCellRenderer(new PanelRender());
table.getColumn("Cancella").setCellEditor(new PanelEditor());
table.setRowHeight(40); //Metto un altezza che mi consenta di vedere tutto il bottone
// Mando tutto a video
JScrollPane tableScroller = new JScrollPane(table);
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.add(tableScroller, BorderLayout.CENTER);
window.pack();
window.setVisible(true);
}
}
Guarda se questo esempio con qualche modifica fa al caso tuo.