В JTable
будет отображаться флажок для столбца, если метод getColumnClass
модели таблицы возвращает Boolean.class
для этого столбца [1] .Вы используете DefaultTableModel
, который возвращает только Object.class
для любого столбца.Эта модель - просто очень простая модель, не самая лучшая для реальной системы, больше для тестирования или очень простых данных.
Лучше всего реализовать собственную TableModel
, возвращающую правильныйкласс для данного столбца, например расширение AbstractTableModel
.
Только для тестирования вы можете просто расширить DefaultTableModel
и переопределить метод getColumnClass
:
var model = new DefaultTableModel(0, 3) {
@Override
public Class<?> getColumnClass(int col) {
if (col == 0) return Boolean.class;
else return super.getColumnClass(col);
}
};
var table = new JTable(model);
model.insertRow(0, List.of(false, "false", 0).toArray());
model.insertRow(1, List.of(true, "true", 1).toArray());
JOptionPane.showMessageDialog(null, table);
Опять же, в долгосрочной перспективе, для реальногоПроект, вы очень скоро застрянете с этим решением - гораздо лучше реализовать выделенный TableModel
.Очень простой (неполный) пример:
public static void main(String[] args) {
var model = new MyTableModel();
var table = new JTable(model);
model.add(new MyData(false, "false", 0));
model.add(new MyData(true, "true", 1));
JOptionPane.showMessageDialog(null, table);
}
static final int FLAG = 0;
static final int NAME = 1;
static final int VALUE = 2;
private static class MyTableModel extends AbstractTableModel {
private final List<MyData> list = new ArrayList<>();
void add(MyData data) {
list.add(data);
}
@Override
public int getRowCount() {
return list.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int row, int col) {
var data = list.get(row);
switch(col) {
case FLAG: return data.flag;
case NAME: return data.name;
case VALUE: return data.value;
}
throw new IllegalArgumentException("column " + col);
}
@Override
public Class<?> getColumnClass(int col) {
switch(col) {
case FLAG: return Boolean.class;
case NAME: return String.class;
case VALUE: return Integer.class;
}
throw new IllegalArgumentException("column " + col);
}
}
private static class MyData {
final boolean flag;
final String name;
final int value;
MyData(boolean flag, String name, int value) {
this.flag = flag;
this.name = name;
this.value = value;
}
}
[1] Учебник по JTable