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 :

Evénement de mise a jour de cellule JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Par défaut Evénement de mise a jour de cellule JTable
    Bonjour à tout le monde,

    J'ai fait une petite application de gestion de stock. Les informations des produits seront entrés dans un JTable avec le clavier ou bien avec un lecteur code barre. Mon problème est que je veux mon JTable déclenche un évènement au fur et a mesure que la valeur d'une cellule est changée comme caretupdate de JTextField.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    On peut écouter les changements d'états des éditeurs de JTable par l'écouteur CellEditorListener, à enregistrer au près de l'instance de TableCellEditor adéquate. Cela permet en revanche uniquement de savoir si une modification est validée ou annulée, pas d'analyser la frappe au fur et à mesure. On ne peut pas plus, parce qu'un TableCellEditor est générique : cela peut être un JTextField, ou un JCheckBox, ou n'importe quoi d'autres (même une JTable si on veut).

    L'écouteur CaretListener ne permet pas d'écouter les changements de saisie dans un JTextField mais les déplacements du curseur. On peut détourner cet écouteur pour analyser la saisie au fur et à mesure, mais il est bien plus judicieux et simple d'utiliser un DocumentListener (field.getDocument().addDocumentListener(new DocumentListener() {/*...*/});) ou encore un InputVerifier (field.setInputVerifier(new InputVerifier(){/*...*/})) s'il s'agit de faire de la validation en particulier.

    Si les évenements du CellEditorListener ne te suffisent pas pour faire ce que tu as à faire, tu peux faire ton propre TableCellEditor. Par exemple, en partant d'un DefaultCellEditor, ça pourra être très simple :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    JTextField textField = new JTextField();
    // ici tu ajoutes tous les écouteurs que tu veux sur le textField;
    DefaultCellEditor cellEditor = new DefaultCellEditor(textField); // on créé un éditeur par défaut avec le JTextField précédemment défini
    table.getColumnModel().getColumn(columnIndex).setCellEditor(cellEditor); // par exemple, pour affecter l'éditeur sur la colonne d'index columnIndex
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Par défaut
    Merci pour votre réponse.
    J'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TableColumn soprtColumn = jTable1.getColumnModel().getColumn(2);
    soprtColumn.setCellEditor(new DefaultCellEditor(jTextField1));
    jTable1.setCellSelectionEnabled(false);
    pour mettre une jtextField et tout à fait bien.
    Mais des fois, la cellule qui contient le JTextField n'affiche pas ce qui est vraiment dans la cellule de table puisque le JTextField est mis à jour par moi-même et lorsque le jtable miet a jour le JTextField, il reste non modifié.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il ne faut surtout pas toucher au contenu du JTextField (ou alors il faut bien maitriser le fonctionnement de la saisie).

    Il faudrait que j'en sache plus ce que tu cherches à faire exactement et ce que tu fais (comment tu réalises ce que tu cherches à faire... montre ton code en particulier)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre actif
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Il ne faut surtout pas toucher au contenu du JTextField (ou alors il faut bien maitriser le fonctionnement de la saisie).

    Il faudrait que j'en sache plus ce que tu cherches à faire exactement et ce que tu fais (comment tu réalises ce que tu cherches à faire... montre ton code en particulier)
    bon j'ai fait une petite exemple pour être facile à comprendre qui montre mon probleme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    public class Exo {
     
        private String title[] = {"code", "nom", "qte"};
        Hashtable base = new Hashtable();
        Hashtable liste = new Hashtable();
        DefaultTableModel mod;
        JTextField tf;
     
        public Exo() {
     
            base.put("10", "10&sourie&1");
            base.put("20", "20&clavier&1");
            base.put("30", "30&ecron&1");
     
            JFrame f = new JFrame();
            f.setBounds(0, 0, 400, 400);
            f.setLayout(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mod = new DefaultTableModel(null, title);
            final JTable table = new JTable(mod);
            JScrollPane sc = new JScrollPane(table);
            sc.setBounds(10, 10, 350, 350);
            tf = new JTextField();
            tf.getDocument().addDocumentListener(new DocumentListener() {
                public void changedUpdate(DocumentEvent e) {
                }
                public void removeUpdate(DocumentEvent e) {
                }
                public void insertUpdate(DocumentEvent e) {
                    save();
                }
            });
            TableColumn soprtColumn = table.getColumnModel().getColumn(0);
            soprtColumn.setCellEditor(new DefaultCellEditor(tf));
            table.setCellSelectionEnabled(false);
            mod.addRow(new Vector());
            f.add(sc);
            f.setVisible(true);
        }
     
        public void save() {
            String prod = (String) base.get(tf.getText());
            int qte = 1;
            if (prod != null) {
                String tab[] = prod.split("&");
                if (liste.containsKey(tab[0])) {
                    qte = qte + 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.remove(tab[0]);
                    liste.put(tab[0], value);
                } else {
                    qte = 1;
                    String value = tab[0] + "&" + tab[1] + "&" + qte;
                    liste.put(tab[0], value);
                }
                actualiser();
            }
        }
     
        public void actualiser() {
            mod.setNumRows(0);
            Enumeration en = liste.elements();
            while (en.hasMoreElements()) {
                String value = (String) en.nextElement();
                String[] tab = value.split("&");
                Object data[] = {tab[0], tab[1], tab[2]};
                mod.addRow(data);
            }
            mod.addRow(new Vector());
        }
     
        public static void main(String[] args) {
            new Exo();
        }
    }
    Nom : Sans titre.png
Affichages : 765
Taille : 24,0 Ko

    lorsque je saisie 10, la table met a jours normalement.
    lorsque j'efface 10 et la remplacer par 20, la table met a jour mais la colonne code affiche 20 et 20 au lieu des 10 et 20.
    en plus je veux que lorsque la table met a jour le curseur se placer dans la cellule suivante de la colonne code.
    merci d'avance.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Le problème est que tu changes le contenu du modèle (tu supprimes tout et réinsères) pendant l'édition. En plus tu stockes tes données dans des Hashtable (au passage, tu devrais plutôt utiliser une HashMap), l'ordre n'est pas garanti et la ligne en cours de saisie peut changer, donc devenir complètement incohérente par rapport à la donnée en cours de saisie.
    Essaye déjà de forcer la fin de l'édition, par table.getCellEditor().stopCellEditing().
    Ensuite, arrange-toi pour ne pas supprimer tout pour tout réinsérer, mais ajoute juste la nouvelle ligne.

    Par ailleurs, tu peux gérer le changement de cellule éditée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    table.changeSelection(row, col, false, false);
    table.editCellAt(row, col);
    Autres points :
    1. Map<String, String> base = new HashMap<>();.
      Plus besoin de caster :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      String prod = base.get(tf.getText());
    2. Je pense que le code suivant ne fonctionne pas :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      int qte = 1;
              if (prod != null) {
                  String tab[] = prod.split("&");
                  if (liste.containsKey(tab[0])) {
                      qte = qte + 1;
                      String value = tab[0] + "&" + tab[1] + "&" + qte;
                      liste.remove(tab[0]);
                      liste.put(tab[0], value);
                  } else {
                      qte = 1;
                      String value = tab[0] + "&" + tab[1] + "&" + qte;
                      liste.put(tab[0], value);
                  }
                  actualiser();
              }
      qte vaut toujours soit 1, soit 2. Alors que je suppose que tu voudrais que qte s'incrémente à chaque fois que la valeur est déjà saisie. Donc il faudrait reparser la ligne contenue dans liste. Plutôt faire une classe qui représente ton objet, en conséquence au lieu de parser et concaténer à chaque fois.
      Au passage :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      liste.remove(tab[0]);
      liste.put(tab[0], value);
      Le remove ne sert à rien : le put remplacera le précédent mapping.
    3. f.setLayout(null); .
      de préférence ne pas supprimer le layoutmanager et éviter de forcer les positions et tailles en dur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Mise à jour cellule JTable
    Par RomG7 dans le forum Composants
    Réponses: 1
    Dernier message: 06/06/2013, 09h36
  2. mise a jour d'une Jtable
    Par boumacmilan dans le forum Composants
    Réponses: 1
    Dernier message: 22/06/2009, 11h35
  3. Problème de mise a jours d'une JTable
    Par vinzzzz dans le forum Composants
    Réponses: 9
    Dernier message: 01/06/2009, 10h05
  4. Requete mise a jour si cellule vide
    Par Percevan dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 31/08/2007, 18h38
  5. mise à jour d'une JTable ?
    Par Sakalam dans le forum Composants
    Réponses: 11
    Dernier message: 15/09/2006, 15h06

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