我们需要稍微修改TableModel,这样我们就可以控制Class列的类型...
public class MyTableModel extends DefaultTableModel {
private List<Class> columnTypes;
public MyTableModel() {
}
public MyTableModel(int rowCount, int columnCount) {
super(rowCount, columnCount);
}
public MyTableModel(Vector columnNames, int rowCount) {
super(columnNames, rowCount);
}
public MyTableModel(Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
}
public MyTableModel(Vector data, Vector columnNames) {
super(data, columnNames);
}
public MyTableModel(Object[][] data, Object[] columnNames) {
super(data, columnNames);
}
public MyTableModel(List<Class> columnTypes) {
this.columnTypes = columnTypes;
}
public MyTableModel(List<Class> columnTypes, Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
this.columnTypes = columnTypes;
}
public MyTableModel(List<Class> columnTypes, Object[][] data, Object[] columnNames) {
super(data, columnNames);
this.columnTypes = columnTypes;
}
public MyTableModel(List<Class> columnTypes, Vector data, Vector columnNames) {
super(data, columnNames);
this.columnTypes = columnTypes;
}
public MyTableModel(List<Class> columnTypes, Vector columnNames, int rowCount) {
super(columnNames, rowCount);
this.columnTypes = columnTypes;
}
public MyTableModel(List<Class> columnTypes, int rowCount, int columnCount) {
super(rowCount, columnCount);
this.columnTypes = columnTypes;
}
public void setColumnTypes(List<Class> columnTypes) {
this.columnTypes = columnTypes;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnTypes.get(columnIndex);
}
}
然后,我们从数据库中加载数据,您可以使用ResultSet中的ResultSetMetaData来确定该列代表的最合适的对象类型(基于ResultSet#getObject的返回结果)
MyTableModel tableModel = new MyTableModel();
try (ResultSet rs = ...) {
ResultSetMetaData rsmd = rs.getMetaData();
List<Class> columnTypes = new ArrayList<Class>(rsmd.getColumnCount());
for (int column = 0; column < rsmd.getColumnCount(); column++) {
String className = rsmd.getColumnClassName(column + 1);
try {
columnTypes.add(Class.forName(className));
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
columnTypes.add(Object.class);
}
}
tableModel.setColumnTypes(columnTypes);
// Load data from the ResultSet
} catch (SQLException exp) {
exp.printStackTrace();
}
更多详情请见JDBC Database Access...