IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Detecter un changement sur une ligne dans une JTable


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut Detecter un changement sur une ligne dans une JTable
    Bonjour,

    Ces sacrés JTable vont me faire devenir fou, j'ai un problème pour "remonter" la détection d'une modification d'une cellule à ma JTable et je n'arrive pas trouver de solution correcte, je m'explique :

    - j'ai une interface graphique avec une JTable.
    - j'ai un TableModele qui étend AbstractTableModel.
    - J'ai des objets qui sont passés sous forme de vecteur à ce TableModele, et celui-ci s'occupe de renvoyer les valeurs à afficher via getValueAt(int,int)...

    Jusque la tout va bien...

    Maintenant, lorsque je fais une modification sur l'une des cellules, je voudrais noter que mon objet est à mettre à jour, seulement les solutions que j'ai trouvé ne me conviennent pas vraiment :

    - je peux mettre un booléen dans l'objet que je passe à true lorsque je modifie une cellule (et donc une proporiétés de cette objet) via la méthode setValueAt(), mais bon mes objets représente ma base et je ne voudrais pas mettre d'attributs "parasite" et je pense que ce n'est pas "propre" de faire comme cela.
    - je peux mettre un vecteur d'objet (ex objToUpdate) correspondant à tous mes objets à mettre à jour dans ma classe d'interface. De cette façon je retrouver ceux qui ont été modifiés dans ma liste.
    Cependant, pour ajouter les objets au vecteur, je n'ai pas trouver d'autres solutions que de le faire à partir du TableModel, et donc mon TableModel doit connaître ce vecteur la (objToUpdate), et donc soit je met ma classe TableModel dans la classe d'interface afin de pouvoir accéder à "objToUpdate", soit je rajoute un paramètre à mon modèle et passe objToUpdate à l'instanciation de TableModele...
    pas terrible...

    J'ai pas d'autres solutions à l'heure actuelle sachant que je ne veux pas mettre à jour "en temps réel" mais que je veux faire d'abord toutes les actions et déclencher la sauvegarde au clic sur un bouton "Enregistrer"...

    Avez vous une idée ?

    Merci d'avance.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Je comprends pas vraiment ton soucis de modélisation.

    je suppose que tu veux sauvegarder uniquement les valeurs qui ont changées car le tableau est trop lourd, trop de lignes ou aute...

    L'idéal est d'étendre TableModelListener en TableModelCellChanged pour avoir une nouvelle méthode du type tableModelCellChanged(TableModelCellEvent event) ou l'évènement te renvoi le tableau=source, la cellule, l'ancien et le nouveau contenu. Ca c'est propre.

    Ensuite je ferai peut etre de l'auto-crinie (un objet est à l'écoute de lui même), pour mettre à jour une liste permetttant de retrouver les cellules modifiées.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Oups j'ai dit une connerie mais j'ai le droit

    Tu as déjà dans TableModelEvent des indications sur la cellule

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci pour ta réponse, cela dit (une fois n'est pas coutume), j'ai quelques interrogations sur celle ci :

    En effet, tu as compris ce que je voulais faire, mais ce que je veux surtout, c'est une méthode propre et clair. Le TableModelEvent, j'ai jeté un oeil dessus, mais je n'ai pas trouvé le moyen de l'exploiter pour remonter l'information jusqu'au JTable, Car au final, c'est la classe dans laquelle se situe la JTable qui s'occupe d'enregistrer le tout...

    Au début, je pensais que ca serait simple en utilisant fireTableCellUpdated(int,int), mais je n'ai pas réussi à l'utiliser et j'ai pas compris exactement à quoi servait cette fonction malgré mes recherches... (et elle génère un TableModelEvent justement...).

    Donc si tu as plus d'infos à ce sujet, je prend

    Merci.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Dans ton table model que tu as étendu je ferai tout simplement dans le constructeur this.addModelChangeEventListener(this); tu t'auto écoute.

    Et à l'arrivée d'un event du met à jour une table des modifications.

    Voilà tout.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    La seule fonction qui existe dans TableModel à propos des listener c'est addTableModelListener(TableModelListener).

    Je ne vois pas de addModelChangeEventListener(TableModel) ?

    J'ai d'ailleurs essayé d'ajouter à mon modèle un TableModelListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ChangeTableListener implements TableModelListener {
     
    		public ChangeTableListener() {
    			super();
    		}
     
    		public void tableChanged(TableModelEvent e) {
    			System.out.println("changement");
    		}
     
    	}
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table.getModel().addTableModelListener(new ChangeTableListener());
    Et enfin dans mon TableModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class TableModelVehicleUsed extends AbstractTableModel {
     
    /*...*/
     
     public void setValueAt(Object value, int row, int col) {
           /*... traitement ...*/
     
            /* ici j'envoie normalement le listener doit être déclencher et je devrais effectuer l'action associé à tableChanged de celui ci... mais ca ne marche pas...*/
        	fireTableCellUpdated(row, col);
     
        }
    Je sais pas si je me trompe quelque part, enfin je sais pas ou je me trompe plutôt...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Rahhh le boulet !!

    Ça marche très bien si je redéfini pas mon TableModel autre part...

    J'ai une dernière question, si c'est une suppression que je veux faire, j'appelle fireTableRowsDeleted(row, row) sur la ligne supprimée, mais le listener n'a aucun moyen de connaître l'objet qui vient d'être supprimé je me trompe (puisque le traitement de la suppression se fait avant l'appelle à la fonction c'est bien ca la logique ?) ?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    je ne sais plus quel est l'ordre mais effectivement je pense que tu as raisons, car c'est un évènement envoyé par le model et non un simple évènement graphique de demande de modification du modèle. Cependant je n'en suis pas si certain.

    En conclusion il ne te reste plus qu'à tout mettre en cache. Mais ta politique est peut être un peu bizarre.

    Soit tu as un tableau de données entier que tu enregistres en écrasant tout un ancien contenu (genre dans un fichier).

    Soit tu fonctionne en mode lazy et dans ce cas tu modifies des valeurs en base à chaque action. Donc pas de boutons Validate, Cancel.

    Toi tu pars presque sur un pattern mémento avec un cache de modification. Je te conseil ce pattern au point ou tu es mais ne conserve que la séquence des commandes (CRUD). Au moins tu peux faire un CTRL Z

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Je ne te suis pas à 100% mais ma logique ne me parait pas abérrante :

    - je charge un tableau à partir d'objet chargés depuis une base de données.
    - je fais des modifications sur le tableau et je met à jour les objets associés au fur et à mesure
    - j'enregistre le tout après validation de l'utilisateur

    Cela me permet de gérer les accès à la base (j'y accède que lors de l'appui sur le bouton "enregistrer" ce qui me permet de pas avoir de temps d'accès à chaque modification vu que c'est une base distante).

    Après je suis ouvert à toute autre solution qui me paraitrai mieux

    Merci pour ces informations en tout cas.

Discussions similaires

  1. Réponses: 15
    Dernier message: 21/10/2009, 13h31
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. [MySQL] inserer une ligne d'une table dans une autre table
    Par piero53 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/12/2008, 18h29
  5. Réponses: 3
    Dernier message: 29/01/2008, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo