2009-03-16 7 views
2

Lorsque je sélectionne une ligne dans un JTable, mon JTable n'est plus mis à jour. Lorsque je ne sélectionne pas une ligne, le code ci-dessous fonctionne comme prévu. Une ligne est ajoutée à la table JTable.JTable pas de mise à jour lors de la sélection

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

} 

Lorsque je ferme la fenêtre et la rouvre, je peux voir la nouvelle ligne. Est-ce que quelqu'un peut m'expliquer pourquoi, après avoir sélectionné une ligne, je ne vois plus de mises à jour dans le JTable?

Répondre

0

L'appel à update() se produit-il dans le thread d'événement Swing? Sinon le code devra être enveloppé avec quelque chose comme:

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

Il existe un certain nombre de problèmes avec votre code. Vous ne devriez pas appeler fireTableStructureChanged car ceci est lié à la structure de la table (non des colonnes etc) ne modifiant pas les données de la table elle-même (ajout d'une ligne, modification de la valeur d'une cellule, etc.). En outre, vous ne devriez pas avoir besoin d'appeler repaint et doLayout sur la table elle-même car cela devrait être déclenché par les changements de modèle.

Je pense que vous devriez jeter un oeil à How to Use Tables à partir du tutoriel Java, spécifiquement regarder à l'aide de modèles de table, en écoutant les changements de données et en tirant des événements de changement de données.

Questions connexes