Насколько мне известно, ваш JTable
должен обновляться автоматически при изменении TableModel
. Посмотрите учебник sun по , работающему с таблицами , и, в частности, раздел по прослушиванию изменений данных , это может помочь. Тем не менее, у меня есть пара замечаний:
Я действительно не понимаю метод getValueAt(int row, int col)
. Разве вы не должны получить сообщение строки и столбец этого сообщения?
Я бы добавил addRow(...)
и addRows(...)
к реализации MsgTable
TableModel для обновления внутренней модели и запуска соответствующего события.
Вам не нужно вводить TableModelListener
(я все равно не вижу никакого вызова addTableModelListener(...)
)
(РЕДАКТИРОВАТЬ: ОП обновил свой вопрос новым кодом, поэтому я соответствующим образом обновляю свой ответ ниже.)
Вы изменили подпись и тело load(...)
, чтобы добавить вызов к addTableModelListener(...)
, и я думаю, что обе модификации неверны.
О addTableModelListener (...) , документация гласит:
Добавляет слушателя в список, который уведомляется каждый раз, когда происходит изменение модели данных.
И о различных fireFooXxx(...)
методах:
Уведомляет всех слушателей, что [произошло изменение]
То есть со следующей реализацией TableModelListener
:
@Override
public void tableChanged(TableModelEvent arg0) {
// TODO Auto-generated method stub
fireTableDataChanged();
}
Вы в конечном итоге будете делать бесконечные рекурсивные вызовы (слушатель уведомляется об изменении и запускает событие, которое уведомит его снова и т. Д.), Следовательно, java.lang.StackOverflowError .
На самом деле, я все еще думаю, что вам не нужен TableModelListener
(и то, как вы регистрируете его, не является правильным IMO, см. Прослушивание изменений данных в руководстве Sun). Таким образом, я бы удалил implements TableModelListener
и реализовал бы метод load(...)
следующим образом:
void load(Enumeration e) {
while(e.hasMoreElements()) {
queueList.add(e.nextElement());
}
fireTableDataChanged();
}