Ошибка StackOverflowError, вызываемая TableModelListener - PullRequest
6 голосов
/ 19 апреля 2010

Я не уверен, почему это повторяется.

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)

Любая помощь приветствуется.

Ответы [ 4 ]

9 голосов
/ 13 февраля 2011

Из обработчика событий (метод 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);
}

Это временно отключит слушателя, пока вы работаете над проверками.

2 голосов
/ 19 апреля 2010

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

1 голос
/ 19 апреля 2010

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

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

0 голосов
/ 06 ноября 2010

Я столкнулся с той же проблемой ранее при использовании jlist. Мое решение состояло в том, чтобы просто изменить последовательность моих строк кода.

  1. Получить все jpanel с изображениями.
  2. Добавить слушателя непосредственно перед добавлением object[] к jlist

Проблема, с которой я столкнулся ранее (при создании stack-overflow error было добавление слушателя сначала jlist, , а затем , получение всех jpanel с изображениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...