0

我已经实现了一个自定义表模型,如下所示:

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

当我显示具有上述 TableModel 的 JTable 时,我收到上述方法引发的 NullPointerException。

我认为异常是由于数据库表中的一些空单元格。

如果异常是由于数据库表中的空单元格引起的,那么如何解决这个问题?

数据库中的每一列都没有一定的价值。有些列可以不包含任何内容。

4

4 回答 4

1

一个问题是为什么这些特定坐标为空。如果它是合法的,并且您只想呈现任何特殊内容,那么您需要做的是空检查并返回 Object.class 例如:

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

这将确保使用默认渲染器,并且由于没有值,因此不会渲染任何内容。

于 2010-02-04T19:29:55.660 回答
1

如果单元格可以包含空值,那么对空值调用 getClass() 肯定会给您 NPE。当然你可以检查 null,但你真正的问题比这更微妙。

TableModel 接口指定getColumnClass(int)应返回“列中所有单元格值的最具体的超类”。从外观上看,您可以为单个列返回任意数量的类类型,从而有效地破坏了 TableModel 契约。

通常,对于给定的表数据集,列类型是静态的,这意味着除非基础表数据已更改,否则列的类不应更改。我认为重要的是要问为什么需要返回这样一个特定的值。

如果您想为给定的类类型呈现特定的东西,您最好滚动自己的TableCellRenderer,并在每个单元格的基础上确定 Object 类型。从那里您可以根据需要进行任何特定的渲染。

于 2010-02-04T19:38:44.257 回答
0

也许:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

我希望它对你有帮助。

于 2010-02-04T19:29:22.603 回答
0

除了到目前为止的答案:假设您的模型由 a 支持List(如您在上一个问题中所建议的那样),您将看到IndexOutOfBoundsExceptionif 尝试在不包含行(即为空)JTable时呈现您的模型。这是一个令人讨厌的边缘情况(我意识到你正在尝试渲染- 你怎么知道不会是空的?)。TableModelListResultSetResultSet

为避免这种情况,您为什么不按照我最初的建议进行并从ResultSetMetaData?

于 2010-02-04T20:47:17.280 回答