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