DefaultTableModel在创建

时间:2015-09-15 07:45:49

标签: java jdbc jtable extends defaulttablemodel

目前我遇到了以下问题:

我从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);

}

通过这样做,我将data从我的数据库和columnNames传递给DefaulTableModel的构造函数。问题是,并非所有列都包含相同的数据类型(看似默认类型似乎是String),因此我需要在创建DefaultTableModel时直接为所有列设置数据类型。怎么会这样?我以后没有找到更改列类的方法。

如果我创建自己的&#34; TableModelClass&#34;扩展DefaultTableModel,我如何创建一个类似于这样的构造函数:

TableModelClass(data, columnNames, columnType)
  

columnType应该是包含类类型的向量   String.classBoolean.class等。

1 个答案:

答案 0 :(得分:0)

ResultSetMetaData md = rs.getMetaData();

可能是您预期的信息。打开时只调用一次,当查询结果中的零行时元数据也可以。

BTW我通常

  1. 构建一种“表元数据”,如人类可读的列标题(波兰语)。
  2. 在某些行中知道null(你没事)
  3. 我传统上使用Map< String,OBject >,但矢量很好。
  4. copy&amp;从我的真实代码中粘贴,此示例来自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;
    }