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 :

[JTable] Récupérer données d'une cellule éditée


Sujet :

Composants Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut [JTable] Récupérer données d'une cellule éditée
    Bonjour,
    J'utilise une JTable, une des colonnes est définite pour l'instant avec le CellEditor qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setCellEditor(new DefaultCellEditor(formattedTextField))
    seulement si je veux récupéré la valeur que l'utilisateur modifie, faut-il forcément que je crée une nouvelle classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    newClass extends AbstractCellEditor et implements TableCellEditor
    et qu'ensuite c'est cette nouvelle classe qui est affecté au CellEditor ?

    merci

  2. #2
    Membre à l'essai

    Inscrit en
    Septembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Tu as regardé la doc Sun ? L'utilisation de base d'un JTable y est bien expliquée ...

    http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je ne comprend pas ton problème...
    Si tu veux récupérer la valeur d'une cellule il te suffit de faire un getValueAt() sur ta JTable ou ton TableModel... L'editor n'est utilisé que pour la saisie des données...

    a++

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    c vrai que le n'ai pas été clair , en fait mon pb est que dans les autres colonnes (ou j'utilise un JSpinner et ou j'ai donc du implémenté un cellEditor que j'avais créé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        column1.setCellEditor(new SecondParamCellEditor(15));
    Dans le cellEditor j'ai attribué un addChangeListener sur le spinner et comme ça dès qu'il y a une modif je lé récupère.

    Dans l'autre cas avec le JTextField, ce que vous medite c'est que c moi qui peut doit aller récupérer la valeur lors du click sur OK par exemple en utilisant le getValue.
    Donc juste pour confirmation, si je veux que ca ce passe automatiquemet je dois crée un nouveau cellEditor et mettre un évènement ?

  5. #5
    Membre à l'essai

    Inscrit en
    Septembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Si j'ai bien compris tu veux récupérer un évènement dès qu'une de tes cellules change. Dans ce cas il faut que que tu écoutes la JTable elle-même avec un TableModelListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taTable.getModel().addTableModelListener(ton_TableModelListener);
    La méthode tableChanged(TableModelEvent arg0) te permettra de gérer les modifs de ta table.

    Ce que tu as fait avec ton JSpinner est faut : le CellEditor ne doit pas être utilisé pour gérer les donnees. Comme l'a dit adiGuba, il ne sert qu'à la saisie.

    Bon courage

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok merci,
    quand vous dites que c'est faux, fonctionnellement moi cela marche, c'est faux conceptuellement c'est ca ?

  7. #7
    Membre à l'essai

    Inscrit en
    Septembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Oui, c'est faux conceptuellement, et c'est à mon avis bcp moins pratique. De plus tu risques de rencontrer des problèmes si tu dois faire évoluer ta JTable plus tard (pour ajouter des fonctionnalités par ex).

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    merci je fais les modif mais je trouve q mes modif sont lourde, peut etre je me complique la vie :
    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
     
        table.getModel().addTableModelListener(new TableModelListener() {
     
          public void tableChanged(TableModelEvent e) {
            int column = secondParamTable.getSelectedColumn();
            // Récupère le buffer :
            Rs232GageBuffer buffer = (Rs232GageBuffer) secondParamTable.getValueAt(secondParamTable.getSelectedRow(), column );
            // Suivant la colonne, on enregistre le champ, le caractère ou le nombre :
            if (column == 1) {
              TableColumn tableColumn = secondParamTable.getColumnModel().getColumn(column);
              JSpinner spinner = (JSpinner) tableColumn.getCellEditor().getCellEditorValue();
              Integer integer = (Integer) spinner.getValue(); 
              buffer.setField(integer.intValue());
            }
          }
     
        });
    C compliqué car le Spinner est définit dans le CellEditor de la colonne, (dans un autre fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        column1.setCellEditor(new SecondParamCellEditor(1));
    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
     
    public class SecondParamCellEditor extends AbstractCellEditor implements TableCellEditor {
      private Rs232GageBuffer buffer;
      private JSpinner        spinner;
     
      public SecondParamCellEditor(int column) {
        spinner = new JSpinner();
        spinner.setModel(new SpinnerNumberModel(0, 0, 15, 1));
        if (column == 1) {
          spinner.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent event) {
              JSpinner spinner = (JSpinner) event.getSource();
              Integer integer = (Integer) spinner.getValue();
              buffer.setField(integer.intValue());
            }
          });
        } else {
          spinner.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent event) {
              JSpinner spinner = (JSpinner) event.getSource();
              Integer integer = (Integer) spinner.getValue();
              buffer.setCount(integer.intValue());
            }
          });
        }
      }
    Le dernier morceaux de code je ne l'ai pas encore modifié mais c'étai pour gérer les modif dans le CellEditor...
    Pour le 1er morceau de code je trouve ca lourd surtout qu'il faut traiter 3 colonnes différemment, et 2 d'entre elle on le spinner et l'autre un JFormattedTestField qui lui ai déclaré dans le fichier actuel...

    cela devient compliqué...
    Je continu les modif?

  9. #9
    Membre à l'essai

    Inscrit en
    Septembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Je ne suis pas vraiment expert en JTable. J'en ai une seule à mon actif et je n'ai pas eu besoin de créer un CellEditor.

    Dans ton tableChanged il est vrai que tu dois faire un switch pour chacune de tes colonnes (je te conseille d'utiliser des constantes pour tes index de colonnes, en cas tu veuilles rajouter une colonne un jour). Les méthodes TableModelEvent.get...() te renvoient la sélection en cours. Tu récupères alors la valeur de la cellule en cours avec un simple ta_table.getValueAt().

    Cependant je suppose que pour que cela marche, ton CellEditor doit mettre à jour le modèle de données (TableModel) de la table. C'est le TableModel qui gère toutes les données, c'est là que va taper le getValueAt().

    Mais je ne maîtrise pas le CellEditor, donc je ne peux t'aider plus (en espérant ne pas avoir dit de bêtises jusque là). Regarde la doc que je t'ai indiqué, je crois qu'il parle du CellEditor. Essai de taper JTable+JSpinner sur Google, on trouve pas mal d'exemples sur les JTable.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok c ce qui peut expliquer que je ne rentre jamais dans la métode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
        table.getModel().addTableModelListener(new TableModelListener() {
     
          public void tableChanged(TableModelEvent e) {
            int column = secondParamTable.getSelectedColumn();
            System.out.println("tableChanged : column = " + column);
    ...
        }
       });
    pour lui le model ne change jamais, mais je n'ai pas compris comment le faire ce modifier...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2015, 13h37
  2. Modifier plusieurs Cellules JTable et données d'une Table
    Par lecaire dans le forum Composants
    Réponses: 0
    Dernier message: 08/09/2013, 21h41
  3. récupérer les données d'une cellule depuis un UserForm
    Par domy59 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/12/2008, 00h09
  4. Réponses: 3
    Dernier message: 17/06/2008, 17h05
  5. Réponses: 1
    Dernier message: 06/02/2008, 09h10

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