Моя Jtable Model не делает мой логический флажок - PullRequest
0 голосов
/ 10 октября 2018

извините, но я все еще не получаю эту вещь из моей базы данных, не поменяйте флажок.это просто показывает, как истина или ложь

try {

    stmt = con.createStatement();
    rs = stmt.executeQuery("SELECT * FROM tblpdareenlist");
    DefaultTableModel model = (DefaultTableModel) viewRecordTable.getModel();
    int x = 0;

    String b, c, d, e, f, g, h, i;
    Boolean a;
    while (rs.next()) {
      a = rs.getBoolean("colAttend");
      b = rs.getString("colNr");
      c = rs.getString("colRank");
      d = rs.getString("colFName");
      e = rs.getString("colMName");
      f = rs.getString("colLName");
      g = rs.getString("colSN");
      h = rs.getString("colUnit");
      i = rs.getString("colETE");
      model.insertRow(x, new Object[]{a,b,c,d,e,f,g,h,i});
      x++;
    }
  } catch (Exception e) {
    JOptionPane.showMessageDialog(rootPane, "Syntax Error\n" + e);
  }

1 Ответ

0 голосов
/ 10 октября 2018

В 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

...