Я пришел к другому решению, так как хотел повторно использовать редакторы по умолчанию… Следующий класс переопределяет getColumnClass, чтобы получить другой ответ. Насколько я тестировал, он работает нормально, и я могу использовать setDefaultEditor и так далее. Вы можете заметить, что можно улучшить это поведение, применив его только к нужным столбцам.
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. Возможно расширение JTable
вместо JXTable
.