2010-02-14 3 views
1

Я пытаюсь создать свой собственный настраиваемый TableModel для моего JTable (потому что я хотел бы включить строку JCheckBox в мою таблицу.) У меня есть JTable в JScrollPane также. Прежде чем я попытался включить JCheckBox и пользовательский AbstractTableModel, JTable будет отображаться отлично, если я использовал конструктор по умолчанию (Object [] [], Object []). Я прочитал в JTable учебнике по Sun, что эти конструкторы используют по умолчанию обработку всех данных в виде строк.Получение JTable с пользовательской моделью таблицы для отображения в JScrollPane

Затем я создал свой обычай AbstractTableModel и пошел от этого:

JTable table = new JTable(dataArray, col); 

к этому:

JTable table = new JTable(); 

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

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

ответ

1

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

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

MyTableModel model = new MyTableModel(); 
// ...initialise model if required 
JTable table = new JTable(model); 
+0

Я думаю, что это то, что я смущен. JTable Информация о Sun веба-странице состоянии: Есть два JTable конструкторов, которые непосредственно принимают данные (SimpleTableDemo использует первое): JTable (Object [] [] ROWDATA, Object [] columnNames) JTable (Vector ROWDATA, Vector columnNames) В нем затем указывается: Преимущество этих конструкторов в том, что они просты в использовании. Однако эти конструкторы также имеют недостатки: Они обрабатывают все типы данных одинаково (как строки). – MarcZero

+0

Итак, читаю, у меня создается впечатление, что мне нужно создать собственный класс, который расширяет AbstractTableModel, и как-то создающая таблица будет использовать это вместо стандартного конструктора. Если я использую конструктор JTable (Object [] [], Object []), он обрабатывает каждую ячейку как строки, поэтому я «предполагаю», что вызов метода без конструктора: JTable() будет использовать пользовательский, который я создал, но мой экран теперь пуст. Я могу вернуться к конструктору по умолчанию, и он выглядит просто отлично, но я не могу заставить его использовать мою пользовательскую таблицу. – MarcZero

+0

@MarcZero: См. Изменения в моем ответе. (Если это не имеет смысла, возможно, разместите еще какой-нибудь код. У меня такое чувство, что я могу что-то упустить в том, что вы пытаетесь сделать ...) – Ash

0

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

class MyTableModel extends AbstractTableModel { 
//code here 
} 

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

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

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

1

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

0

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

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

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