即使查询数据,DefaultTableModel 也是空的

Posted

技术标签:

【中文标题】即使查询数据,DefaultTableModel 也是空的【英文标题】:DefaultTableModel is empty even tho data is queried 【发布时间】:2016-11-17 13:30:34 【问题描述】:

我尝试在 DefaultTableModel 类的帮助下将我的 ResultSet 数据放入 JTable。作为解决方案,我在 *** 上找到了一个解决方案,但对其进行了一些修改(此处并不真正相关):

    public static DefaultTableModel buildTableModel(ResultSet rs) 
    try 
        ResultSetMetaData metaData = rs.getMetaData();
        Vector<String> columnNames = new Vector<String>();
        int columnCount = metaData.getColumnCount();
        for (int column = 1; column <= columnCount;++column) 
            columnNames.add(metaData.getColumnName(column));
        
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        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);
     catch(SQLException e) 
        e.printStackTrace();
        return new DefaultTableModel(new Vector<>(), new Vector<>());
    

当我调试这段代码时,我能够看到:

ResultSet rs 有数据, ColumnNames 已填充, RowCount 为零 我认为问题出在这一行vector.add(rs.getObject(columnIndex)); 看起来我的向量变空了,因为 getObject() 已经没有返回任何数据。

有人可以帮我解决这个问题或解释问题出在哪里吗?当我将生成的 DefaultTableModel 绑定到我的 JTable 时,它​​是空的(不显示数据)。

【问题讨论】:

DefaultTableModel 在现有方法中是否没有行? 是的,行数为零@dev-null。 代码看起来很合理。您需要添加调试代码来验证您的循环是否按预期执行。如果行数为零,这告诉我 ResultSet 是空的。 ResultSet 不为空,行数也不为空。只是 .add() 导致了一个空数据集......为什么!? 行数是多少?将每个对象添加到向量时是否显示其值?这将确认 Vector 已创建。 add() 方法不是问题。我们帮不了你。您需要自己调试代码。在每个循环和每个 if 语句中添加 System.out 语句,以准确查看正在执行的代码。我刚刚注意到的一件事。为什么用++columnIndex 代码通常是columnIndex++ 【参考方案1】:

我建议使用 AbstractTableModel 作为基础。几年前,我在 Sun 的示例中发现了一个名为 JDBCAdapter.java 的类。这门课做的,你想要的。在网上搜索这门课,你会得到一些满足你大部分需求的东西。如果您的应用程序应该能够将更改写回数据库,但只是为了显示表就可以了,这可能是一个挑战。

【讨论】:

【参考方案2】:

我不久前才发现问题:问题在于光标设置为最后一行,因为其他方法已经迭代了相同的 ResultSet,因此必须使用第一种方法再次将光标设置为第一行ResultSet 类。

【讨论】:

对于其他阅读本文的人,这就是您立即将 ResultSet 复制到 List 的原因。传递 ResultSet 是危险的。 感谢您的提示@GilbertLeBlanc!我很少这样做,但不知道这是通常的做法。现在我更聪明了;)。

以上是关于即使查询数据,DefaultTableModel 也是空的的主要内容,如果未能解决你的问题,请参考以下文章

DefaultTableModel 不刷新

如何在 defaulttablemodel 上添加行

应该在哪里定义我的可选 DefaultTableModel 方法?

Java Swing 如何使用DefaultTableModel交替刷新JTable?

如何隐藏 DefaultTableModel 中的特定列以使其在表中显示?

JAVA--DefaultTableModel内容清零