Java 如何修复由JTable事件生成的StackOverflower错误?
当我试图用同一行的另外两个单元格的乘法填充一个单元格时,我得到了一个StackOverflower错误。 代码如下:Java 如何修复由JTable事件生成的StackOverflower错误?,java,swing,netbeans,jtable,Java,Swing,Netbeans,Jtable,当我试图用同一行的另外两个单元格的乘法填充一个单元格时,我得到了一个StackOverflower错误。 代码如下: tableModel.addTableModelListener(new TableModelListener(){ public void tableChanged(TableModelEvent e) { DefaultTableModel model = (DefaultTableModel)e
tableModel.addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e)
{
DefaultTableModel model = (DefaultTableModel)e.getSource();
//Object data = model.getValueAt(e.getFirstRow(), e.getColumn());
if (e.getColumn() == 0)
{
Object data = model.getValueAt(e.getFirstRow(), e.getColumn());
String stockSymbol = (String)data;
XMLService2 myService = new XMLService2(stockSymbol);
String stockName = XMLService2.getStockName();
model.setValueAt(stockName, e.getFirstRow(), e.getColumn() + 1);
}
if (model.getValueAt(e.getFirstRow(), 2) != null && model.getValueAt(e.getFirstRow(), 3) != null)
{
Double myDouble =(Integer)model.getValueAt(e.getFirstRow(), 2)*(Double)model.getValueAt(e.getFirstRow(), 3);
model.setValueAt(myDouble, e.getFirstRow(), 4);
}
}
});
此代码中调用setValueAt函数的最后一行是生成StackOverflowerError。
多谢各位
附言:
该表由5列组成。
第三列的类型为整数。
第四列的类型为双栏。
获取第3和第4个单元格的乘法结果的第5列的类型是Double 由于最后一个
model.setValueAt
行触发另一个tableChanged
事件,程序陷入了无休止的递归循环(至少直到堆栈溢出为止)。尝试将第二个条件语句更改为
if (e.getColumn() != 4 && model.getValueAt(e.getFirstRow(), 2) != null && model.getValueAt(e.getFirstRow(), 3) != null)
这应该可以防止在更新最后一列时重新触发事件。我认为更好的方法是向网格提供一个自定义的TableModel,其中getValueAt被覆盖,因此您想要的操作在那里执行(col3*col5)
检查调用堆栈窗口以查看其来源。然后,如果问题仍然存在,请再次向stackoverflow询问您的stackoverflow问题!;)Cheers不知道该代码做什么,但是
model.setValueAt
可能会导致再次调用tableChanged
,从而再次设置值,这。。。结果是一个无限循环。永远不要更改回调方法中调用方(即模型)的状态!相反,实现一个自定义模型,该模型会根据需要进行自我更新,并且仅当所有内部更新完成时才会触发。该模型会根据症状进行修改,而不是治愈疾病;-)请看我对这个问题的评论。是的:定制模型是最好的选择。嗯:在getter中进行计算是可以做到的,前提是结果总是相同的(这没有意义;-),如果它发生变化,模型很容易违反它的契约(如果它以前没有通知它的侦听器)。虽然这是可以处理的,但在setters中进行计算更安全-当更改计算中使用的列时。顺便说一句:有更新的api文档要链接,在@Andrew看到它之前更好地编辑和更新:-)