2010-08-13 9 views
2

J'ai une table de AbstractTableModel. Les données de la table sont stockées dans un vecteur. Maintenant, lorsque je supprime une ligne, je l'enlève avec succès du vecteur, mais cela n'est pas mis à jour dans la vue, c'est-à-dire dans l'interface graphique.Java Swing - Suppression de lignes de la table avec AbstractTableModel()

J'ai lu ailleurs que je dois utiliser fireTableRowsDeleted(), et je suis en train de l'appeler dans une méthode d'emballage dans mon AbstractTableModel:

dataModel = new AbstractTableModel() { 
      public void removeAl() { 
        fireTableRowsDeleted(0, getRowCount()-1); 
      } 
}; 

Mais, ce removeAl n'est pas accessible pour moi. Je ne peux pas appeler comme ça n'importe où: dataModel.removeAl()

Pourriez-vous s'il vous plaît m'aider à comprendre ce qui ne va pas? Comment mettre à jour l'interface utilisateur graphique lors de la suppression de lignes?

EDIT: En fin de compte, le problème était ailleurs. Une fois que j'ai corrigé cela, enlever la ligne du vecteur lui-même a commencé à mettre à jour l'interface graphique. :)

+0

Je réponds, mais veuillez d'abord accepter quelques réponses. –

+0

@Romain Le but de stackoverflow.com est la connaissance de partage, pas accumuler le score de réputation. –

+0

Je suis désolé de ne pas prêter attention. J'ai accepté des réponses à toutes mes questions maintenant. Pourriez-vous s'il vous plaît reconsidérer me répondre? – Chaitanya

Répondre

1

Vous ne pouvez pas voir votre méthode removeAll parce qu'elle est déclarée dans une classe anonyme - une classe anonyme ne peut pas être nommée par son nom, aucune nouvelle déclaration n'est accessible. Pour cette raison, les déclarations publiques dans les classes anonymes sont généralement des substitutions, puisqu'elles seront disponibles en utilisant la classe de base non anonyme.

Pour résoudre ce problème, déclarez votre modèle de table comme une sous-classe régulière de AbstractTableModel

public class MyTableModel extends AbstractTableModel { 

    public void removeAll() { 
     fireTableRowsDeleted(...); 
    } 
} 

Votre code client devra alors jeter à MyTableModel pour accéder à la méthode removeAll().

Une solution plus simple, mais moins bonne, est de continuer à utiliser les clients AbstractTableModel et d'appeler explicitement les clients au fireTableRowsDeleted().

+0

Merci pour la réponse. Je vais essayer cela et vous laisser savoir comment ça se passe. – Chaitanya

3

En plus de ce que MDMA a dit, il faut aussi remplacer les méthodes suivantes de l'interface TableModel (ils sont laissés par AbstractTableModel pas mises en œuvre), donc vous ne pouvez pas instancier une sous-classe AbstractTableModel à moins qu'il ne remplace ces méthodes:

public int getRowCount(); 
public int getColumnCount(); 
public Object getValueAt(int row, int column); 

Enfin, le simple lancement de tableRowsDeleted dans votre méthode ne sera pas suffisant, vous aurez besoin d'avoir un impact sur ce que les 3 méthodes précédentes retournent; c'est-à-dire après removeAll() est appelé, vous devez vous assurer que getRowCount() renvoie 0, sinon vous aurez des problèmes (NullPointerException ou équivalent dans le pire des cas, JTable rafraîchir les problèmes dans le meilleur des cas)!

Peut-être que vous feriez mieux d'utiliser DefaultTableModel dans un premier temps, cela vous faciliterait la tâche. Dérivant de AbstractTableModel viendrait plus tard. Cela dépend beaucoup de ce que vous voulez faire ...

Questions connexes