Получение JTable с настраиваемой моделью таблицы для отображения в JScrollPane

StackOverflow https://stackoverflow.com/questions/2259815

Вопрос

Я пытаюсь создать свою собственную 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, как визуализировать каждую ячейку.Если вы не переопределите это, оно будет отображаться просто как строка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top