从结果集填充表时更改列的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 } }