【问题标题】:DefaultTableModel set column class at creationDefaultTableModel 在创建时设置列类
【发布时间】:2015-09-15 07:45:49
【问题描述】:

目前我遇到以下问题:

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

}

通过这样做,我将数据库中的datacolumnNames 传递给DefaulTableModel 的构造函数。问题是,并非我的所有列都包含相同的数据类型(似乎默认类型似乎是字符串),所以我需要在创建DefaultTableModel 时直接为所有列设置数据类型。这怎么可能呢?我没有找到稍后更改列类的方法。

如果我创建自己的扩展 DefaultTableModel 的“TableModelClass”,我需要如何创建一个像这样工作的构造函数:

TableModelClass(data, columnNames, columnType)

columnType 应该是包含类类型的向量,例如 String.classBoolean.class

【问题讨论】:

    标签: java jdbc jtable extends defaulttablemodel


    【解决方案1】:

    ResultSetMetaData md = rs.getMetaData();

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

    顺便说一句,我通常

    1. 构建一种“表元数据”,如人类可读的列标题(波兰语)。
    2. 注意某些行中的 null (你没问题)
    3. 我传统上使用Map&lt; String,OBject &gt;,但矢量很好。

    从我的真实代码中复制和粘贴,此示例来自网络(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;
    }
    

    【讨论】:

    • 谢谢你的回答,你能给我一个小例子/代码sn-p,因为我不确定我是否理解你。
    • 代码有额外的解决方案,不会编译。但也许会有所帮助:)
    • "prawo" -> "right" 一些列左/右对齐,元数据可能从 1 开始索引。
    • 警告:我在这个片段中的数据库类型不多,即日期字段等,您必须添加代码。
    • 对我来说看起来不错,但为什么你的 switch 有所有的情况,只使用java.sql.Types.NUMERIC 情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2021-05-11
    • 2011-05-26
    • 2011-01-18
    相关资源
    最近更新 更多