Je viens à une autre solution, puisque je voulais réutiliser les éditeurs par défaut ... La classe suivante redéfinit le getColumnClass pour avoir une réponse différente. Pour autant que j'ai testé, cela fonctionne très bien, et je peux utiliser setDefaultEditor et ainsi de suite. Vous pouvez remarquer qu'il est possible d'améliorer ce comportement pour l'appliquer uniquement aux colonnes souhaitées.
public class JXMultiTypeColumnTable extends JXTable {
private Map<Integer, Class<?>> viewedClassByColumn = new HashMap<Integer, Class<?>>();
public JXMultiTypeColumnTable(Object[][] rowData, Object[] columnNames) {
super(rowData, columnNames);
}
public JXMultiTypeColumnTable(int numRows, int numColumns) {
super(numRows, numColumns);
}
public JXMultiTypeColumnTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
super(dm, cm, sm);
}
public JXMultiTypeColumnTable(TableModel dm, TableColumnModel cm) {
super(dm, cm);
}
public JXMultiTypeColumnTable(TableModel dm) {
super(dm);
}
public JXMultiTypeColumnTable() {
}
@Override
public Class<?> getColumnClass(int column) {
Class<?> recordedClass = this.viewedClassByColumn.get(column);
if (recordedClass != null) {
return recordedClass;
}
return super.getColumnClass(column);
}
private void recordViewedClass(int row, int column) {
this.viewedClassByColumn.put(column,
this.getModel().getValueAt(
this.convertRowIndexToModel(row), this.convertColumnIndexToModel(column))
.getClass());
}
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
this.recordViewedClass(row, column);
return super.getCellRenderer(row, column);
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
this.recordViewedClass(row, column);
return super.getCellEditor(row, column);
}
}
N.B. Il est possible d'étendre JTable
au lieu de JXTable
.