We need to modify the TableModel
slightly, so we can control the column Class
types...
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);
}
}
Then, we you load the data from the database, you can use the ResultSetMetaData
from the ResultSet
to make determinations about the most appropriate type of object that the column represents (base on the return result of 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();
}
See JDBC Database Access for more details...