简体   繁体   English

DefaultTableModel在创建时设置列类

[英]DefaultTableModel set column class at creation

Currently I got the following problem: 目前,我遇到以下问题:

I load the TableModel data from a H2 database like so: 我从H2数据库中加载Ta​​bleModel数据,如下所示:

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 . 通过这样做,我将数据库和columnNamesdata传递给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.classBoolean.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 顺便说一句我通常

  1. build kind of "table metadata" like human readable column captions (Polish language). 建立一种“表格元数据”,例如人类可读的列标题(波兰语)。
  2. be aware at null in some rows (You are ok) 注意某些行中为null(您可以)
  3. I use traditionally 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM