StackOverflowError由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)
任何帮助赞赏。
JTable.setValueAt会导致tablechanged事件触发,因此您将在事件处理程序中重复调用事件处理程序。 在模型中设置值,而不是在表中。
从事件处理程序(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); }
这将在您进行validation时暂时禁用侦听器。
您正在更新事件处理程序中的值以进行更新。 这将自然地触发再次调用事件处理程序。 这将触发再次调用事件处理程序等。
在进行更新之前,您可能需要删除侦听器。
我在使用jlist
时jlist
了同样的问题。 我的解决方案是简单地改变我的代码行的顺序。
- 获取所有具有图像的
jpanel
。 - 在将
object[]
添加到jlist
之前添加一个监听jlist
我之前遇到的问题(创建stack-overflow error
是首先将监听器添加到jlist
, 然后使用图像获取所有jpanel
。