JTable - 一列中的多个单元格编辑器

Kon*_*rus 11 java swing jtable

我希望我JTable在一列中为不同的单元格使用不同的单元格编辑器.想象一下两列标签值表,如:

Name          | Value
--------------+--------------------------------
Identifier    | ST33442 (string editor)
Purchase Date | 7/7/10 (custom calendar editor)
Status        | Broken (combo editor)
Run Code Online (Sandbox Code Playgroud)

如何动态构建编辑器?像一个TableCellEditorFactory完美的东西.

Gui*_*ume 8

您必须实现自己的单元格编辑器并将其分配给列.您可能应该对单元格渲染器执行相同操作(例如,布尔值将呈现为复选框而不是"true"/"false").

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

NB DatePickerCellEditor来自SwingX