2009-03-16 2 views
2

Когда я выбираю строку в JTable, мой JTable больше не обновляется. Когда я не выбираю строку, код ниже работает как ожидалось. Строка добавляется в JTable.JTable no update when selection

@Override 
public void update (Observable arg0, Object arg1) 
{ 
    if (arg0 instanceof Logger) 
    { 
     LogItem last = systemController.logController.getLog().getLastLogItem(); 
     this.history.add(last); 
     this.logTableModel.addItem(last); 

     this.logTable.tableChanged(new TableModelEvent(this.logTableModel)); 
     ((DefaultTableModel)this.logTable.getModel()).fireTableStructureChanged(); 
     this.logTable.repaint(); 
     this.logTable.doLayout(); 
    } 

} 

Когда я закрываю окно и снова открываю его, я вижу новую строку.

Может кто-нибудь объяснить мне, почему после выбора строки я больше не вижу никаких обновлений в JTable?

ответ

0

Возникает ли вызов update() в потоке событий Swing? Если код не должен быть обернут чем-то вроде:

SwingUtilities.invokeLater(new Runnable() { public void run() { 
    logTableModel.addItem(last); 
}}); 
3

С кодом возникает ряд проблем. Вы не должны называть fireTableStructureChanged, поскольку это связано с структурой таблицы (без столбцов и т. Д.), Изменяя не сами данные таблицы (добавление строки, изменение значения ячейки и т. Д.). Кроме того, вам не нужно вызывать repaint и doLayout на самой таблице, так как это должно быть вызвано изменениями модели.

Я думаю, что вы должны взглянуть на How to Use Tables из учебника Java, в частности, посмотреть на использование моделей таблиц, прослушивание изменений данных и запуск событий изменения данных.