在jtable中输入双精度单元格中的空白值

问题描述:

我有自定义表模型,并且还为jtable中有问题的双列自定义渲染。我想要在双列中留下空白单元格的选项。事实上,当我将它留空时,写入为空。这个选项在另一个字符串列中是默认的,但是在这里如果我把它留空,就会抛出一些异常。我如何做到这一点?在jtable中输入双精度单元格中的空白值

编辑:这是错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at table.MyTableModel.setValueAt(MyTableModel.java:62) 
    at javax.swing.JTable.setValueAt(JTable.java:2710) 
    at javax.swing.JTable.editingStopped(JTable.java:4712) 

这里是MyTaleModel

public void setValueAt(Object value, int row, int col) { 

    data.get(row)[col] = value; 
    fireTableCellUpdated(row, col); 
} 

这是数据的代码:static ArrayList<Object[]> data

,这是列渲染

public class ColumnRenderer extends DefaultTableCellRenderer { 

int precision = 0; 
Number numberValue; 
NumberFormat nf; 

public ColumnRenderer(int p_precision) { 
    super(); 
    setHorizontalAlignment(SwingConstants.RIGHT); 
    precision = p_precision; 
    nf = NumberFormat.getNumberInstance(); 
    nf.setMinimumFractionDigits(p_precision); 
    nf.setMaximumFractionDigits(p_precision); 
} 

@Override 
public void setValue(Object value) { 
    if ((value != null) && (value instanceof Number)) { 
     numberValue = (Number) value; 
     value = nf.format(numberValue.doubleValue()); 
    } 
    super.setValue(value); 
} 
+2

“有些”异常?发生在特定位置的特定异常被抛出。它包含一个特定的消息,旨在被读取。如果您不了解堆栈跟踪,至少要显示它,并附上相应的代码。 –

+0

由'setValue'引起的'NullPointerException'应该与您的单元格渲染器无关,它与您使用XxxTableModel时的数据/模型/编辑器 – MadProgrammer

+0

有关,与渲染器无关, – mKorbel

我认为你应该使用包装类Double代替double,原始类型不能用null分配,但包装类型可以。这是原因,其他具有不同类型的单元例如String正在按String工作,也可以分配到null

+0

否 - 出什么问题实际使用表单元格渲染器 – MadProgrammer

在您定制的单元格渲染器中,您需要考虑实际是一个空值。您可以从表模型或预定义值(例如0)返回null

如果模型实际上是返回Double则变得容易得多......

在你自定义单元格渲染,你将需要为“空”状态的检查......

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    if (value == null) { 
     value = ""; 
    } else { 
     // Carry on as normal... 
    } 
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
} 

不是一个真正的答案,但太长的评论。

如果您只想显示Double实例,则不需要自定义渲染器。默认的渲染器能够处理这种情况。唯一的先决条件是您在TableModel中为getColumnClass方法返回正确的课程。

您可以在源代码中看到默认渲染器已足够。一个快速复制粘贴:

static class DoubleRenderer extends NumberRenderer { 
    NumberFormat formatter; 
    public DoubleRenderer() { super(); } 

    public void setValue(Object value) { 
     if (formatter == null) { 
      formatter = NumberFormat.getInstance(); 
     } 
     setText((value == null) ? "" : formatter.format(value)); 
    } 
} 

所以你很可能做错你不告诉我们。发布堆栈跟踪和相关代码以获得更好的答案。

+0

请参阅OP的上一个问题 – mKorbel