1

同じ行の他の 2 つのセルの乗算でセルを埋めようとすると、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 つの列で構成されています。3 列目の型は整数です。4 列目の型は Double です。3 番目と 4 番目のセルの乗算の結果を取得する 5 列目の型は Double です。

4

2 に答える 2

1

model.setValueAt最後の行で別のtableChangedイベントが発生するため、プログラムは (少なくともスタックがオーバーフローするまで) 無限の再帰ループに陥っています。2 番目の条件ステートメントを次のように変更してみてください。

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

これにより、最後の列が更新されたときにイベントが再発生するのを防ぐことができます。

于 2012-09-10T22:57:51.303 に答える
1

より良い方法は、getValueAt がオーバーライドされるカスタム TableModel をグリッドに提供することだと思います。したがって、必要な操作はそこで実行されます (col3*col5)。

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

于 2012-09-10T23:04:39.487 に答える