2012-09-10 30 views
1

當我嘗試用同一行的其他兩個單元格的乘法填充單元格時,出現StackOverflowError錯誤。 下面是代碼:如何解決由JTable事件生成的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。

+0

檢查調用堆棧窗口以查看它來自何處。然後如果問題仍然存在,再次問你的stackoverflow問題的stackoverflow! ;)乾杯 – Rikki

+0

不知道代碼做了些什麼,但'model.setValueAt'可能會導致'tableChanged'再次被調用,它再次設置該值,這導致無限循環。 – zapl

+1

不會更改回調方法中的調用方(即模型)的狀態!相反,實現一個自定義模型,根據需要自行更新,並且只有當所有內部更新完成時纔會觸發。 – kleopatra

回答

1

由於最後的model.setValueAt行觸發了另一個tableChanged事件,程序正在陷入無限遞歸循環(至少在堆棧溢出之前)。嘗試將第二個條件語句更改爲

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

這應防止最後一列更新時重新觸發事件。

+0

非常感謝。很有幫助的回答! – skiabox

+1

這是醫生的症狀,而不是治癒疾病;-)看到我對這個問題的評論。 – kleopatra

1

我認爲一個更好的方法是提供一個自定義TableModel的網格,其中getValueAt被覆蓋,所以你想要的操作在那裏執行(col3 * col5)。

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

+1

是的:自定義模型是要走的路。 hmm:如果結果總是一樣的話,那麼可以在getter中進行計算(這是沒有道理的;-)如果它變化,模型可能很容易違反它的合約(如果它之前沒有通知它的聽衆) 。雖然這可以處理,但在setter中進行計算更安全 - 在更改calc中使用的列時。順便說一句:有更新的API文件可以鏈接到,更好的編輯和更新之前,@安德魯看到它:-) – kleopatra

相關問題