StackOverflowError由TableModelListener引起

me_*_*ere 6 java swing jtable

我不确定为什么这会复发.

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);
 }

}); 
Run Code Online (Sandbox Code Playgroud)

例外是:(它不断重复)

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)
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

Jai*_*zel 9

从事件处理程序(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);
}
Run Code Online (Sandbox Code Playgroud)

这将在您进行验证时暂时禁用侦听器.


Pau*_*lin 3

JTable.setValueAt 会引发 tablechanged 事件,因此您要从事件处理程序中重复调用事件处理程序。在模型中设置值,而不是在表中设置值。

  • 我知道这已经过时了,但想指出这并不能解决问题,因为无论使用表的 setValueAt 方法还是模型的 setValueAt 方法,表模型都会发生更改。@jaime 的答案至少应该是一个可以接受的答案。 (4认同)