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)

Любая справка ценится.

6
задан skaffman 19 April 2010 в 18:15
поделиться

2 ответа

JTable.setValueAt вызывает срабатывание события tablechanged, поэтому вы неоднократно вызываете обработчик событий из обработчика событий. Установите значение в модели, а не в таблице.

2
ответ дан 9 December 2019 в 20:41
поделиться

Вы обновляете значение в обработчике событий для обновлений. Это, естественно, приведет к повторному вызову обработчика событий. Это приведет к повторному вызову обработчика событий и т. Д.

Возможно, вам потребуется удалить прослушиватель перед выполнением обновления.

1
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: