[英]DefaultTableModel set column class at creation
Currently I got the following problem: 目前,我遇到以下问题:
I load the TableModel data from a H2 database like so: 我从H2数据库中加载TableModel数据,如下所示:
public static DefaultTableModel loadTableModel(ResultSet rs)
throws SQLException {
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = Definitions.COLUMN_NAMES.length;
for (String string : Definitions.COLUMN_NAMES) {
columnNames.add(string);
}
// data of table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
if (rs.getObject(columnIndex).getClass() == Integer.class) {
if ((int) rs.getObject(columnIndex) == 0) {
vector.add(null);
} else {
vector.add(rs.getObject(columnIndex));
}
} else {
vector.add(rs.getObject(columnIndex));
}
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
By doing so I pass over the data
from my database and columnNames
to the constructor of the DefaulTableModel
. 通过这样做,我将数据库和
columnNames
的data
传递给DefaulTableModel
的构造DefaulTableModel
。 The problem is, that not all my columns contain the same data type (seemingly the default type seems to be String), so I need to set the data type for all columns directly while creating the DefaultTableModel
. 问题是,不是我的所有列都包含相同的数据类型(似乎默认类型似乎是String),因此我在创建
DefaultTableModel
需要直接为所有列设置数据类型。 How can this be don? 怎么可以这样 I did not find a method to change the column class later on.
稍后我没有找到更改列类的方法。
If I create my own " TableModelClass
" that extends DefaultTableModel
, how do I need to create a constructor that works something like this: 如果创建扩展
DefaultTableModel
自己的“ TableModelClass
”,那么我需要如何创建一个类似于以下内容的构造函数:
TableModelClass(data, columnNames, columnType)
columnType should be a vector containing the Class types like
String.class
,Boolean.class
etc.columnType应该是一个包含Class类型的向量,例如
String.class
,Boolean.class
等。
ResultSetMetaData md = rs.getMetaData(); ResultSetMetaData md = rs.getMetaData();
probably is info You expected. 可能是您期望的信息。 Call only once while openning, metadata is ok when zero rows is in query result too.
打开时仅调用一次,查询结果中也有零行时元数据也可以。
BTW I usually 顺便说一句我通常
Map< String,OBject >
but vector is good to. Map< String,OBject >
但是vector很适合。 copy & paste from my real code, this sample is from web (Wicket) but data modelling is the same. 从我的真实代码中复制并粘贴,该示例来自Web(Wicket),但数据建模是相同的。
protected Map<String, Object> move_fields() {
Map<String, Object> rec = new HashMap<String, Object>();
// MathContext mc = new MathContext(2);
for (int i = 0; i < columns; i++) {
String key;
try {
key = md.getColumnName(i + 1).toLowerCase();
int type = md.getColumnType(i + 1);
Object o;
switch (type) {
case java.sql.Types.DOUBLE:
case java.sql.Types.DECIMAL:
case java.sql.Types.FLOAT:
case java.sql.Types.NUMERIC:
BigDecimal bd = rs.getBigDecimal(i + 1);
if (bd != null) {
// bd = bd.round(mc);
bd = bd.setScale(2, RoundingMode.HALF_EVEN);
}
o = bd;
break;
default:
o = rs.getObject(i + 1);
break;
}
rec.put(key, o);
} catch (SQLException e) {
e.printStackTrace();
}
}
for (Entry<String, DynamicField> v : virtuals.entrySet()) {
v.getValue().prepare(rs, record, _my_has_next);
Object o = v.getValue().getValue(rs, record, _my_has_next);
rec.put(v.getValue().getNameInTemplate(), o);
}
for (Entry<String, String> f: rest.entrySet()) {
String kolumna = f.getKey();
String prawo = f.getValue();
if(prawa.contains(prawo)){
int c=1;
}
else{
record.put(kolumna, "");
}
}
return rec;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.