使用ResultSet TableModel在JTable中设置getColumnClass

时间:2016-09-14 07:25:18

标签: java swing jtable

我有问题。 我创建了一个像这样的DefaultTableModel - >

alpine-extended-3.4.3-x86.iso

ResulSet充满了MySQL数据库的一些数据。 之后,我使用DataModel创建一个JTable并覆盖设置tableproperties:

public static DefaultTableModel buildTableModel(ResultSet rs)
        throws SQLException {

    ResultSetMetaData metaData = rs.getMetaData();

    // names of columns
    Vector<String> columnNames = new Vector<String>(1,1);
    int columnCount = metaData.getColumnCount();

    for (int column = 1; column <= columnCount; column++) {   
        columnNames.add(metaData.getColumnName(column));
    }

    // data of the table
    Vector<Vector<Object>> data = new Vector<Vector<Object>>(10,2);

    while (rs.next()) {
        Vector<Object> vector = new Vector<Object>();

        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            vector.add(rs.getObject(columnIndex));
        }
        data.add(vector);
    }

    return new DefaultTableModel(data, columnNames);

}

如果我不使用第二部分(@Override getColumClass),它可以正常工作,但如果我添加getColumnClass部分,我会得到这个错误消息:

this.table = new JTable(buildTableModel(this.rs)){
        // Make Cells uneditable
            @Override
            public boolean isCellEditable(int row, int column) {  
                if(table.getColumnName(column).contains("key")) return false;
                if(table.getColumnName(column).contains("datum")) return false;
                if(table.getColumnName(column).contains("user")) return false;
                return true;               
            }

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                Class<?> classType;
                if(columnIndex == 1)
                    classType = Boolean.class;
                else
                    classType = String.class;
                return classType;
            }
        };

该字段包含“true”/“false”。 我做错了什么,但我真的不知道究竟是什么;-( 有人可以帮我解决这个问题吗?

非常感谢

编辑: 我将buildTableModel更改为:

java.lang.String cannot be cast to java.lang.Boolean

现在可行; - )

2 个答案:

答案 0 :(得分:2)

metaData.getColumnType可以返回(注意非常简单的矩阵并且用最少的努力硬编码)

    public Class getColumnClass(int column) {
        int type;
        try {
            type = metaData.getColumnType(column + 1);
        } catch (SQLException e) {
            return super.getColumnClass(column);
        }
        switch (type) {
            case Types.CHAR:
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
                return String.class;
            case Types.BIT:
                return Boolean.class;
            case Types.TINYINT:
            case Types.SMALLINT:
            case Types.INTEGER:
                return Integer.class;
            case Types.BIGINT:
                return Long.class;
            case Types.FLOAT:
            case Types.DOUBLE:
                return Double.class;
            case Types.DATE:
                return java.sql.Date.class;
            default:
                return Object.class;
        }
    }

答案 1 :(得分:1)

您正在尝试将String值分配给布尔列(在Swing表中)。只需确保检索到的数据类型(数据模型)与表数据模型的类型相匹配。