【问题标题】:JTable + getColumnClass() returns null if a cell contains NULL如果单元格包含 NULL,则 JTable + getColumnClass() 返回 null
【发布时间】:2013-02-23 21:09:23
【问题描述】:

我正在尝试通过扩展 DefaultTableModel 并覆盖 getColumnClass() 来对我的 JTable 进行排序,如下所示:

 public Class getColumnClass(int c) {     

  return getValueAt(0, c).getClass();
}

如果该表格单元格中没有 NULL,它工作得非常好。 所以我用以下方式修改它:

  public Class getColumnClass(int c) {


  for(int rowIndex = 0; rowIndex < data.size(); rowIndex++){

    Object[] row = data.get(rowIndex);

    if (row[c] != null) {
        return getValueAt(rowIndex, c).getClass();
    }
  }
  return getValueAt(0, c).getClass();
 }

现在,如果列中至少有一个不为 NULL 的单元格,它再次工作正常。 但是如果列中的所有单元格都是 NULL,它就不起作用(因为它返回 nullPointerException)。

请......帮助...... 提前谢谢

哈桑

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    您事先知道您希望每列包含什么类型吗?

    如果是这样,那么您可以使用类对象构建一个数组并返回适当的对象。

    Class[] columns = new Class[]{String.class, String.class, Date.class};
    
    public Class getColumnClass(int c) {  
         return columns[c];
    }
    

    【讨论】:

    • 那么你唯一的选择就是按照其他答案的建议去做,并在值为 null 时选择要返回的内容。
    【解决方案2】:

    这是我使用的通用代码:

        JTable table = new JTable(data, columnNames)
        {
            public Class getColumnClass(int column)
            {
                for (int row = 0; row < getRowCount(); row++)
                {
                    Object o = getValueAt(row, column);
    
                    if (o != null)
                    {
                        return o.getClass();
                    }
                }
    
                return Object.class;
            }
        };
    

    【讨论】:

    • 希望不在生产代码中 - 通常,不知道类型是一件坏事:没有这些知识,您无法安全地保证 all 单元格该列具有第一个的类型
    【解决方案3】:

    选择“默认”类型。返回字符串.class;是相当安全的解决方案。

    【讨论】:

    • 不,它并不比任何其他任意类型(Object 除外)“更安全”
    • 如果我这样做,那么它将无法正确排序 Integer。
    • 公共类 getColumnClass(int c) { for(int rowIndex = 0; rowIndex String.class 来修复问题。
    • 是的,我就是这个意思。
    【解决方案4】:

    解决这个问题非常简单。看看我所做的代码更改。此代码已经过测试,没有错误

    public Class getColumnClass(int c) {  
      int columnCount;
      // dataModel is an object of the data Model class(default or abstract)
      columnCount=dataModel.getRowCount();
        if(columnCount<=1){
           return String.class;
        }
        return getValueAt(0, c).getClass();
    }
    

    【讨论】:

    • ehh .. 不,这不是一个解决方案(即使您不会通过将 rowCount 命名为 columnCount 来混淆读者 :-)正如我已经在其他一些答案中评论的那样,选择任意类型(Object 除外)是错误的。此外,如果只有一行,条件 null 值
    【解决方案5】:
    public Class getColumnClass(int c) 
        {     
        for(int rowIndex = 0; rowIndex < data.size(); rowIndex++)
        {
            Object[] row = data.get(rowIndex);
            if (row[c] != null) {
                return getValueAt(rowIndex, c).getClass();
            }   
        }
        return String.class;
    }
    

    如果列中的所有单元格都为 NULL,则通过返回 String.class 来修复问题

    【讨论】:

    • 那是错误(正如我在对您接受的答案的评论中已经提到的那样)
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2013-03-22
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多