从结果集填充表时更改列的jtable类型

我有工作人员从结果集中填写jtable,如下所示;

public class WorkerFillTable extends SwingWorker { private DefaultTableModel modeltable; public WorkerFillTable(DefaultTableModel modeltable) { this.modeltable = modeltable; } @Override protected DefaultTableModel doInBackground() throws Exception { ResultSet rs; Statement stmt; String query = "select Name,ID,Status,IsActive from current_conf\n" + "order by Name,ID"; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String connectionUrl = "jdbc:sqlserver://192.168.130.100;" + "databaseName=DBST;" + "user=" + "user1" + ";" + "password=" + "userpass1" + ";"; Connection con = DriverManager.getConnection(connectionUrl); stmt = con.createStatement(); rs = stmt.executeQuery(query); ResultSetMetaData rsmd = rs.getMetaData(); Vector columnNames = new Vector(); int columnCount = rsmd.getColumnCount(); for (int column = 0; column < columnCount; column++) { columnNames.addElement(rsmd.getColumnLabel(column + 1)); } Vector<Vector> data = new Vector<Vector>(); while (rs.next()) { Vector vector = new Vector(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } data.add(vector); } rs.close(); stmt.close(); modeltable = new DefaultTableModel(data, columnNames); return modeltable; } @Override protected void done() { try { TableModel modeltable = get(); sorter = new TableRowSorter(modeltable); cTable.setRowSorter(sorter); cTable.setModel(modeltable); } catch (InterruptedException | ExecutionException ex) { } } } 

但是所有列都是String。 DB的“IsActive”列只有“1”或“0”Jtable将此列显示为“true”或“false”我需要在jtable中编辑最后一列typr到boelan。 我该怎么做 ?

JDBCAdapter扩展了AbstractTableModel ,说明了关系数据库和Java数据类型之间的典型映射。 可以在这里看到,并且可以在samples/demo/jfc/TableExample中找到完整的示例,可以在Java SE Development Kit 8u25演示和示例下载中找到 。 概括地说,

  • 覆盖getColumnClass()

  • ResultSetMetaData获取列的数据type

  • 使用switch(type)返回正确的类型标记 。

还要考虑SwingWorker以便在publish()/process()获得更精细的粒度。

我建议你使用AbstractTableModel的子类并覆盖getColumnClass方法来为JTable设置正确的数据类型。

 public class CustomTableModel extends AbstractTableModel { @Override public int getRowCount() { } @Override public int getColumnCount() { } @Override public Object getValueAt(int rowIndex, int columnIndex) { } @Override public String getColumnName(int index) { } @Override public Class getColumnClass(int i) { //return the Specific class for each column based on index i } }