簡體   English   中英

StackOverflowError由TableModelListener引起

[英]StackOverflowError being caused by a TableModelListener

我不確定為什么這會復發。

jTable1.getModel().addTableModelListener(new TableModelListener() {

 public void tableChanged(TableModelEvent evt) {
  int sum = 0;
  int i=0;
  for (i =0 ; i<2; i++){
   sum = sum + Integer.parseInt(jTable1.getValueAt(0, i).toString());
  }
  jTable1.setValueAt(sum, 0, 2);
 }

}); 

例外是:(它不斷重復)

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
        at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
        at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2553)
        at javax.swing.JTable.getValueAt(JTable.java:2695)
        at testprogram.guitest.TestTableModel$1.tableChanged(TestTableModel.java:63)
        at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
        at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
        at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
        at javax.swing.JTable.setValueAt(JTable.java:2719)

任何幫助贊賞。

從事件處理程序(tableChanged方法)包裝你的代碼,利用setValue方法和代碼來刪除和添加監聽器,就像這樣

public void tableChanged(TableModelEvent e) {
model.removeTableModelListener(this);
// YOUR CODE WITH setValueAt calls begins here
if (ppt == null || cantidad > ppt.getStock()) {

model.setValueAt(ppt != null ? ppt.getStock() : 0, e.getFirstRow(), 3);
}

model.setValueAt(precioUnitario * cantidad, e.getFirstRow(), 4);

// YOUR CODE with setValueAt calls ends here
model.addTableModelListener(this);
}

這將在您進行驗證時暫時禁用偵聽器。

JTable.setValueAt導致tablechanged事件觸發,因此您將在事件處理程序中重復調用事件處理程序。 在模型中設置值,而不是在表中。

您正在更新事件處理程序中的值以進行更新。 這將自然地觸發再次調用事件處理程序。 這將觸發再次調用事件處理程序等。

在進行更新之前,您可能需要刪除偵聽器。

我在使用jlistjlist了同樣的問題。 我的解決方案是簡單地改變我的代碼行的順序。

  1. 獲取所有具有圖像的jpanel
  2. 在將object[]添加到jlist之前添加一個監聽jlist

我之前遇到的問題(創建stack-overflow error是首先將監聽器添加到jlist然后使用圖像獲取所有jpanel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM