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

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


person MarcZero    schedule 14.02.2010    source источник


Ответы (4)


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

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

MyTableModel model = new MyTableModel();
// ...initialise model if required
JTable table = new JTable(model);
person Ash    schedule 14.02.2010
comment
Я думаю, это то, что я смущен. Информация о JTable на веб-странице Sun гласит: Есть два конструктора JTable, которые напрямую принимают данные (SimpleTableDemo использует первый): JTable(Object[][] rowData, Object[] columnNames) JTable(Vector rowData, Vector columnNames) Затем состояния: Преимущество этих конструкторов в том, что они просты в использовании. Однако у этих конструкторов есть и недостатки: они обрабатывают все типы данных одинаково (как строки). - person MarcZero; 14.02.2010
comment
Итак, читая дальше, у меня сложилось впечатление, что мне нужно создать собственный класс, который расширяет AbstractTableModel, и каким-то образом создаваемая таблица будет использовать его вместо конструктора по умолчанию. Если я использую конструктор JTable(Object[][], Object[]), он обрабатывает каждую ячейку как строку, поэтому я предполагаю, что вызов метода без конструктора: JTable() будет использовать пользовательский, созданный мной, но мой экран теперь пустой. Я могу вернуться к конструктору по умолчанию, и он отлично отображается, но я не могу заставить его использовать мою пользовательскую табличную модель. - person MarcZero; 14.02.2010
comment
@MarcZero: см. изменения в моем ответе. (Если это не имеет смысла, возможно, опубликуйте еще немного своего кода. У меня такое чувство, что я могу что-то упустить в том, что вы пытаетесь сделать...) - person Ash; 14.02.2010
comment
Вот оно. Теперь я могу заставить JTable работать, хотя заставить его отображать флажок - это совсем другое дело. Я должен опубликовать еще один вопрос. Спасибо! - person MarcZero; 14.02.2010
comment
ответ Trashgod (stackoverflow.com/questions/2259815/) имеет информацию о флажке. - person Ash; 14.02.2010

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

person trashgod    schedule 14.02.2010

В ПОРЯДКЕ. Изучив свой код, я понял, что если я упущу какие-либо конструкторы, он не найдет ссылку на вашу пользовательскую табличную модель. Итак, если вы создали класс:

class MyTableModel extends AbstractTableModel {
//code here
}

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

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

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

person MarcZero    schedule 14.02.2010

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

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

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

person Frederik Wordenskjold    schedule 14.02.2010