Получение JTable с настраиваемой моделью таблицы для отображения в JScrollPane
-
20-09-2019 - |
Вопрос
Я пытаюсь создать свою собственную TableModel для своего JTable (потому что я хотел бы включить в свою таблицу строку JCheckBox). У меня также есть JTable в JScrollPane.До того, как я попытался объединить JCheckBox и пользовательскую AbstractTableModel, JTable отображался бы нормально, если бы я использовал конструктор по умолчанию (Object[][], Object[]).В учебнике JTable на Sun я прочитал, что эти конструкторы по умолчанию обрабатывают все данные как строки.
Затем я создал свою собственную AbstractTableModel и исходил из этого:
JTable table = new JTable(dataArray, col);
К этому:
JTable table = new JTable();
Я предполагаю, что это вызовет попытку создать JTable с помощью специального класса, расширяющего AbstractTableModel, но теперь в JScrollPane ничего не отображается.
Я использую это неправильно?Я практически скопировал код из руководства Sun и изменил только имена задействованных файлов данных.Я также поместил этот метод в тот же класс.Есть ли другой способ убедиться, что ваша таблица создана с использованием вашей пользовательской модели таблицы?Любое понимание будет оценено по достоинству.
Решение
JTable
имеет несколько конструкторов, которые принимают TableModel
в качестве параметра.Это то, что вы ищете?Судя по предоставленному вами фрагменту кода, похоже, что вы вызываете конструктор по умолчанию и ожидаете, что он каким-то образом будет использовать вашу пользовательскую модель таблицы.(Может быть, какой-то код, который это делает, отсутствует?).Если вы используете конструктор по умолчанию, JTable
внутренне создаст DefaultTableModel
экземпляр и используйте его.
Редактировать:Комментарии не очень хорошо воспринимают код, поэтому добавляю сюда:Чтобы таблица использовала вашу модель, вы должны сделать что-то вроде этого:
MyTableModel model = new MyTableModel();
// ...initialise model if required
JTable table = new JTable(model);
Другие советы
Как вы заметили, Эш прав насчет передачи вашей модели данных в JTable
конструктор.Если ваша модель getColumnClass()
возвращает Boolean.class
, вы получите средство визуализации флажка по умолчанию.Вам может понравиться это пример это иллюстрирует использование специального средства визуализации и редактора.
ХОРОШО.Просмотрев свой код, я понял, что если я оставлю какие-либо конструкторы, он не найдет ссылку на вашу пользовательскую модель таблицы.Итак, если вы создали класс:
class MyTableModel extends AbstractTableModel {
//code here
}
Вам нужно создать его экземпляр в конструкторе JTable следующим образом:
JTable table = new JTable(new MyTableModel());
Таким образом, вы не можете просто оставить это поле пустым и ожидать, что оно «найдет» новый класс AbstractTableModel.
Вам нужно продлить AbstractTableModel
, и передайте это как параметр конструктору вашего JTable.(Как это делает Марк).В дополнение к обязательному методу вам необходимо определить этот метод, чтобы отображать фактические флажки:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
Это подскажет JTable, как визуализировать каждую ячейку.Если вы не переопределите это, оно будет отображаться просто как строка.