【问题标题】:Java StackOverflowErrorJava 堆栈溢出错误
【发布时间】:2011-06-21 10:55:07
【问题描述】:
...
float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));             
DecimalFormat dec = new DecimalFormat("#.###");
model.setValueAt(dec.format(value), e.getLastRow(), 1);
...

在第三行,我得到了 stackOverflowError 异常。我打算从 Object 获取 JTable 单元格值,将其转换为浮点数,将其限制为 3 个小数位,最后转换为 String 并在单元格处设置 3 个小数位的值。

我想问题是我正在更改值,并一次又一次地输入函数。所以 StackOverflow 就是由于这个原因。问题是,我该如何解决这个问题?

完整功能在:Java: Converting data types (抱歉发了两次......这是一个不同的问题,解决方案让我遇到了另一个问题)

【问题讨论】:

  • 您确定您没有多次调用自己导致错误吗?实际的堆栈跟踪是什么?
  • 我知道问题的出现是因为 setValueAt 触发了另一个 tableChanged() 事件。但我不知道如何避免它!

标签: java model jtable stack-overflow


【解决方案1】:

问题在于,setValueAt() 将作为其实现的一部分,对所有已注册的侦听器(包括这个侦听器)调用 tableChanged()

为了避免这种情况,只需检查单元格中的值是否已经是您方法中所需的格式,如果是,则不要执行任何操作。

【讨论】:

  • @Roman Rdgz:如果它解决了您的问题,请考虑接受此答案。
  • 看起来还是有点 hack :)
  • 对不起,DomSelvon,它告诉我要等几分钟才能接受答案,后来我太忙了,无法接受。现在是了,谢谢大家
【解决方案2】:

如果单元格的值未更改,请不要调用 model.setValueAt()。 它应该停止递归。

【讨论】:

    【解决方案3】:

    我认为这个任务通常是通过为表格设置一个自定义编辑器来完成的。这样它将所有输入数据格式化为所需的形式。见this答案。

    【讨论】:

      【解决方案4】:

      也许你需要类似的东西

      String text = (String) model.getValueAt(e.getLastRow(), 1);
      String text2 = new DecimalFormat("#.###").format(Float.parseFloat(text));
      if (!text.equals(text2))
          model.setValueAt(dec.format(value), e.getLastRow(), 1);
      

      【讨论】:

        猜你喜欢
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 2014-04-10
        • 2014-01-26
        • 2019-02-16
        • 1970-01-01
        相关资源
        最近更新 更多