Originariamente inviato da rocklife
per caso, e ti dico per caso!!!

!! non e' che hai un esempio semplice sotto mano??? grazie!!!
Ne ho scritto uno, anche se molto incompleto ma giusto solo per darti una idea.
codice:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class TestFrame extends JFrame {
private JTable table;
private JTextField textField1;
private JTextField textField2;
private JTextField textField3;
public TestFrame() {
super("Test Frame");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 200);
Object[][] dati = { { "paperino" }, { Boolean.TRUE }, { new Integer(123) } };
Object[] colonne = { "Dati" };
table = new JTable(dati, colonne);
JScrollPane scrollPane = new JScrollPane(table);
MyCellRenderer myRenderer = new MyCellRenderer();
table.setDefaultRenderer(Object.class, myRenderer);
getContentPane().add(scrollPane, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestFrame f = new TestFrame();
f.setVisible(true);
}
});
}
}
class MyCellRenderer implements TableCellRenderer {
private JCheckBox booleanCheckBox;
private JComboBox stringsComboBox;
private JLabel numberLabel;
public MyCellRenderer() {
booleanCheckBox = new JCheckBox();
stringsComboBox = new JComboBox(new String[] { "topolino", "paperino" });
numberLabel = new JLabel("", SwingConstants.RIGHT);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Boolean) {
boolean b = ((Boolean) value).booleanValue();
booleanCheckBox.setSelected(b);
return booleanCheckBox;
} else if (value instanceof String) {
stringsComboBox.setSelectedItem(value);
return stringsComboBox;
} else if (value instanceof Integer) {
int v = ((Integer) value).intValue();
numberLabel.setText(String.valueOf(v));
return numberLabel;
} else {
return null; // non dovrebbe succedere
}
}
}
È una tabella con 1 sola colonna e 3 dati di tipo diverso in colonna. Ho definito un apposito renderer che ritorna un componente specifico in base al tipo di dato.
Il renderer l'ho registrato con setDefaultRenderer specificando Object.class perché è il tipo che il table model di default ritorna (non ho definito un table model, passo i dati direttamente a JTable).
È molto incompleto come esempio perché:
a) Non ho definito un "editor", rimane l'editor di default che gestisce solo l'input di una stringa (e se provi ad editare una cella succede che .... diventa di tipo String!).
b) Non ho gestito lo stato di selezione/focus. Quando getTableCellRendererComponent viene invocato, si dovrebbe impostare il componente in modo che mostri visivamente lo stato di selezione/focus. Creando e gestendo così 3 componenti a "mano" e da zero, non l'ho fatto (ci voleva codice in più).
c) Ci sono questioni di performance per cui il componente che il renderer ritorna non dovrebbe fare certe cose perché inutili per come è gestito il rendering della cella (si veda la documentazione e il sorgente di DefaultTableCellRenderer).
d) L'altezza delle righe nella tabella, non dipende dal componente ritornato dal renderer ma è impostato da JTable (si veda setRowHeight()).
Insomma, come vedi, si può fare ma non è così banale ....