【问题标题】:enter blank value in double type cell in jtable在 jtable 的双精度型单元格中输入空白值
【发布时间】:2012-11-07 21:57:46
【问题描述】:

我有自定义表格模型,还为我在 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);
}

【问题讨论】:

  • “一些”异常?抛出发生在特定位置的特定异常。它包含要阅读的特定消息。如果您不了解堆栈跟踪,至少向我们展示一下,以及相应的代码。
  • setValue 引起的NullPointerException 应该与您的单元格渲染器无关,它与数据/模型/编辑器有关
  • 你的 XxxTableModel 有问题,与渲染器无关,

标签: java swing jtable


【解决方案1】:

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

如果您只想显示 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));
    }
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在您的自定义单元格渲染器中,您需要考虑实际的空值是什么。您可以从表模型或预定义值(例如 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);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 2014-04-18
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        相关资源
        最近更新 更多