Ячейка в JTable не редактируема, если тип ячейки не String?


У меня есть своя реализация TableModel, предназначенная для отображения данных из базы данных SQL. Я переопределил все необходимые методы, используя массив строк для имен столбцов, массив arraylist<Object[]> для данных и массив Class<?>[] для всех различных типов, которые могут быть получены из базы данных. У меня также есть логический массив, который определяет, какие столбцы можно редактировать, а какие нет. Раньше у меня все в таблице хранилось как объект, и я еще не реализовал часть типов, и она работала хорошо. Теперь что Я добавил типы в модель, я не могу редактировать ни один столбец типа int, даже если этот столбец доступен для редактирования в моем логическом массиве. Я переопределил метод isEditable(), чтобы просто вернуть значение из этого логического массива, и это возвращает true в рассматриваемом столбце into , но он по-прежнему не редактируется. Это определяет поведение или что-то не так? Я боюсь, что не могу отправить код в данный момент, потому что я на своем телефоне, мой ноутбук не имеет подключения к интернету в данный момент и не будет до конца неделя. Я искал, но Google показывает только много вопросов о том, как сделать ячейки редактируемыми или недоступными для редактирования, а не почему вы не можете редактировать столбец int. EDIT: вот pastebin, показывающий мою проблему: http://pastebin.com/cYJnyyqy

С помощью jdk7 и только столбец string доступен для редактирования, хотя isEditable() возвращает true для всех столбцов.

2 2

2 ответа:

Хм. Я никогда не использовал необработанные типы (например, int.class) для getColumnClass (). Я всегда использовал "обернутые" типы, например Integer.class.

Попробуйте изменить свой Class<?>[] types, чтобы использовать обернутые классы вместо примитивов. например

 Class<?>[] types = {
            String.class,
            Character.class,
            Integer.class,
            ...

Это может потребоваться для Swing, чтобы найти правильный рендерер / TableCellEditor. Но я не уверен...

Ответ на следующий вопрос

  • почему char до сих пор не редактируется

Причина-универсальный редактор по умолчанию: он может обрабатывать только классы, в которых конструктор принимает строку в качестве параметра, а символ-нет.

Вот где JTable.GenericEditor бросает вверх:

public Component getTableCellEditorComponent(JTable table, Object value,
                                         boolean isSelected,
                                         int row, int column) {
    this.value = null;
    ((JComponent)getComponent()).setBorder(new LineBorder(Color.black));
    try {
        Class<?> type = table.getColumnClass(column);
        // Since our obligation is to produce a value which is
        // assignable for the required type it is OK to use the
        // String constructor for columns which are declared
        // to contain Objects. A String is an Object.
        if (type == Object.class) {
            type = String.class;
        }

        // JW: following line fails  
        constructor = type.getConstructor(argTypes);
    }
    catch (Exception e) {
        // JW: so the editor returns a null
        return null;
    }
    return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}

Вот где JTable обрабатывает null:

// JTable.editCellAt(...)
TableCellEditor editor = getCellEditor(row, column);
if (editor != null && editor.isCellEditable(e)) {
    editorComp = prepareEditor(editor, row, column);
    if (editorComp == null) {
        // JW: back out if the comp is null
        removeEditor();
        return false;
    }