1

当我尝试用同一行的其他两个单元格相乘来填充一个单元格时,我得到一个 StackOverflowError。这是代码:

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 函数的这段代码的最后一行产生了 StackOverflowError。谢谢你。

PS:该表由 5 列组成。第三列的类型是整数。第 4 列的类型是 Double。得到第 3 个和第 4 个单元格相乘结果的第 5 列的类型是 Double。

4

2 回答 2

1

程序陷入无限递归循环(至少在堆栈溢出之前),因为最后model.setValueAt一行触发了另一个tableChanged事件。尝试将第二个条件语句更改为

if (e.getColumn() != 4 && model.getValueAt(e.getFirstRow(), 2) != null && model.getValueAt(e.getFirstRow(), 3) != null)

这应该可以防止在更新最后一列时重新触发事件。

于 2012-09-10T22:57:51.303 回答
1

我认为更好的方法是向网格提供自定义 TableModel,其中 getValueAt 被覆盖,因此您想要的操作在那里执行(col3 * col5)。

http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/table/TableModel.html

于 2012-09-10T23:04:39.487 回答