2009-03-16 4 views
2

Wenn ich eine Zeile in einer JTable auswähle, wird meine JTable nicht mehr aktualisiert. Wenn ich keine Zeile auswähle, funktioniert der Code darunter wie erwartet. Eine Zeile wird zur JTable hinzugefügt.JTable kein Update bei Auswahl

@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(); 
    } 

} 

Wenn ich das Fenster schließen und wieder öffnen, kann ich die neue Zeile sehen.

Kann mir jemand erklären, warum ich nach dem Auswählen einer Zeile keine Aktualisierungen mehr in der JTable sehe?

Antwort

0

Tritt der update() - Aufruf im Swing-Ereignisthread auf? Wenn nicht, muss der Code mit etwas wie:

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

Es gibt eine Reihe von Problemen mit Ihrem Code. Sie sollten fireTableStructureChanged nicht aufrufen, da dies mit der Tabellenstruktur (Anzahl der Spalten usw.) zusammenhängt und nicht die Tabellendaten selbst ändert (Hinzufügen einer Zeile, Ändern eines Zellenwerts usw.). Außerdem sollten Sie repaint und doLayout nicht in der Tabelle selbst aufrufen müssen, da dies durch Modelländerungen ausgelöst werden sollte.

Ich denke, Sie sollten einen Blick auf How to Use Tables von der Java-Tutorial, insbesondere mit Tabellenmodellen betrachten, auf Datenänderungen und feuern Daten ändern Ereignisse.