2011-06-21 47 views
0
... 
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位小数。Java StackOverflowError

我想问题是我正在改变价值,并一次又一次地进入函数。所以StackOverflow是由于这一点。问题是,我该如何解决这个问题?

功能齐全的:Java: Converting data types (对不起张贴的两倍...这是一个不同的问题,以及解决开车送我去一个不同的问题)

+2

你确定你是不是叫自己多次导致错误?什么是实际的堆栈跟踪? –

+0

我知道问题来了,因为setValueAt触发另一个tableChanged()事件。但我不知道如何避免它! –

+0

[什么是StackOverflowError?]可能的重复(http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald

回答

3

的问题是,setValueAt()会,作为其实现的一部分请在所有已注册的听众(包括此人)上致电tableChanged()

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

+0

就是这样!谢谢! :) –

+1

@罗曼Rdgz:考虑接受这个答案,如果它已经解决了你的问题。 – spot35

+0

仍然看起来有点破解:) –

1

只要不改变单元格的值,不要调用model.setValueAt()。 它应该停止递归。

1

我认为这个任务通常是通过设置一个自定义编辑器来完成的。以便将所有输入数据格式化为所需的格式。请参阅this的答案。

0

也许你需要像

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);