Получение JTable с настраиваемой табличной моделью для отображения в JScrollPane - PullRequest
1 голос
/ 14 февраля 2010

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

Ответы [ 4 ]

1 голос
/ 14 февраля 2010

Как вы заметили, Эш прав в передаче вашей модели данных в конструктор JTable. Если getColumnClass() вашей модели возвращает Boolean.class, вы получите флажок рендерера по умолчанию . Вам может понравиться пример , который иллюстрирует использование пользовательского рендерера и редактора.

1 голос
/ 14 февраля 2010

JTable имеет несколько конструкторов, которые принимают TableModel в качестве параметра. Это то, что вы ищете? Из предоставленного вами фрагмента кода кажется, что вы вызываете конструктор по умолчанию и ожидаете, что он каким-то образом будет использовать вашу собственную модель таблицы. (Может быть, отсутствует какой-то код, который делает это?). Если вы используете конструктор по умолчанию, JTable будет внутренне создавать экземпляр DefaultTableModel и использовать его.

Edit: Комментарии не очень хорошо воспринимают код, поэтому добавим сюда: Чтобы таблица использовала вашу модель, вы должны сделать что-то вроде этого:

MyTableModel model = new MyTableModel();
// ...initialise model if required
JTable table = new JTable(model);
0 голосов
/ 14 февраля 2010

Вам нужно расширить AbstractTableModel и передать это как параметр для конструктора вашего JTable. (Как и Марк). В дополнение к обязательному методу, вам нужно определить этот метод, чтобы показать фактические флажки:

 public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

Это говорит вам JTable, как визуализировать каждую ячейку. Если вы не переопределите это, оно будет отображено в виде строки.

0 голосов
/ 14 февраля 2010

OK. Просмотрев мой код, я понял, что если я пропущу какие-либо конструкторы, он не найдет ссылку на вашу пользовательскую модель таблицы. Итак, если вы создали класс:

class MyTableModel extends AbstractTableModel {
//code here
}

Вам нужно создать его экземпляр в конструкторе JTable следующим образом:

JTable table = new JTable(new MyTableModel());

Таким образом, вы не можете просто оставить его пустым и ожидать, что он "найдет" новый класс AbstractTableModel.

...