row[2] = createDistributionComboBoxForRing(k);
row[3] = String.format("%.2f", plume.getThicknessOfRing(k));
row[4] = String.format("%.2f", plume.getTimeForRing(k));
row[5] = String.format("%.2f", plume.getRateForRing(k));
row[6] = new JCheckBox();
((JCheckBox) row[6]).setSelected(true);
TableModel для JTable хранит данные, а не компоненты.
Таким образом, если столбец 3 содержит объект Integer
, тогда вы сохраняете Integer
в TableModel
и устанавливаете редактор для столбца как поле со списком, содержащим список допустимых целых чисел.
То же самое для столбца, содержащего флажок рендерер / редактор. В этом случае вы сохраняете объект Boolean
.
Например:
row[2] = new Integer(1);
row[6] = Boolean.TRUE
Теперь в TableModel вы должны указать таблице, какой тип данных в каждом столбце, поэтому вам нужно переопределить метод getColumnClass(...)
. Что-то вроде:
tableModel = new DefaultTableModel(data,header)
{
@Override
public Class getColumnClass(int column)
{
switch (column)
{
case 2: return Integer.class;
case 6: return Boolean.class;
default: return Object.class;
}
}
};
Теперь в таблице можно выбрать соответствующий рендерер и редактор для каждого столбца.
Однако в случае поля со списком вам необходимо создать пользовательский редактор со значениями для поля со списком. См. Раздел из учебника Swing по Использование комбинированного окна в качестве редактора для рабочего примера того, как это сделать.
Кроме того, вы неправильно используете другие методы:
dataTable.removeAll();
Не уверен, для чего это. Это метод контейнера для удаления компонентов с панели. Все, что вам нужно, это оператор setModel(...)
для сброса таблицы.
dataTable.updateUI();
Нет необходимости использовать метод updateUI (). Этот метод используется внутри, когда изменяется LAF. Вы не меняете LAF, поэтому избавьтесь от этого утверждения.