Я хотел бы мой JTable
использовать различных редакторов ячейки для различных ячеек в отдельном столбце. Думайте о таблице значений маркировки на два столбца как:
Name | Value
--------------+--------------------------------
Identifier | ST33442 (string editor)
Purchase Date | 7/7/10 (custom calendar editor)
Status | Broken (combo editor)
Как я могу создать редактора динамично? Что-то как a TableCellEditorFactory
было бы прекрасно.
Вам нужно реализовать собственный редактор ячеек и назначить его столбцу. Вероятно, вам следует сделать то же самое с средством визуализации ячеек (так, например, логические значения будут отображаться как флажок вместо «истина» / «ложь»).
public class TableEditorTest {
public static void main(String[] args) {
Object[][] data = new Object[][] {{"Identifier", "ST33442"}, {"Purchase Date", new Date()}, {"Status", Boolean.FALSE}};
String[] columnNames = new String[] {"Name", "Value"};
TableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setVisible(true);
table.getColumnModel().getColumn(1).setCellEditor(new CustomTableCellEditor());
}
public static class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private TableCellEditor editor;
@Override
public Object getCellEditorValue() {
if (editor != null) {
return editor.getCellEditorValue();
}
return null;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value instanceof Date) {
editor = new DatePickerCellEditor();
} else if (value instanceof String) {
editor = new DefaultCellEditor(new JTextField());
} else if (value instanceof Boolean) {
editor = new DefaultCellEditor(new JCheckBox());
}
return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
}
}
}
Примечание. DatePickerCellEditor
от SwingX