Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复由JTable事件生成的StackOverflower错误?_Java_Swing_Netbeans_Jtable - Fatal编程技术网

Java 如何修复由JTable事件生成的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

当我试图用同一行的另外两个单元格的乘法填充一个单元格时,我得到了一个StackOverflower错误。 代码如下:

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看到它之前更好地编辑和更新:-)