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 :

Modifier une cellule d'un tableau quand une autre cellule est éditée


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut Modifier une cellule d'un tableau quand une autre cellule est éditée
    Mon problème:

    Dans un tableau, j'aimerais que les cellules de la colonne "Montant" soit égales aux deux cellules précédentes (Prix et Quantité). Quand j'implémente une méthode permettant d'écouter si mon tableau est modifié/édité, ca ne fonctionne pas.


    Ma classe principale est un JPanel où je créé une Jtable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableModel tableModel = new TableModel(data, title);
    this.tableau = new JTable(tableModel);
    Ma classe correspondant au modele du tableau est la suivante :

    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
     
    public class TableModel extends AbstractTableModel implements TableModelListener {
     
      private Object[][] data;
      private String[] title;
     
      public TableModel(Object[][] data, String[] title){
        this.data = data;
        this.title = title;
        addTableModelListener(this);
      }
      .................
      .................        
      @Override
       public void tableChanged(TableModelEvent e) {
            System.out.println("Point1");
     
       }
    }
    Pour vérifier si le listener fonctionne bien, je teste à l'aide d'un System.out.println. Le message ne s'affiche pas. Comment je peux faire pour qu'il s'affiche lorsque qu'une cellule de mon tableau vient dêtre éditée?

    Merci d'avance pour vos réponses.

  2. #2
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    Bonjour,

    Tu dois surcharger la méthode public void setValueAt(Object value,int row, int column) et modifier la cellulle que tu veux modifier en fonction de value ensuite notifier tout les listeners que la valeur de la cellulle a changé avec la méthode fireTableDataChanged(). Ca devrait donner ça :

    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
    public class TableModel extends AbstractTableModel implements TableModelListener{
    
    private Object[][] data;
    private String[] title;
    
    public TableModel(Object[][] data, String[] title){
        this.data = data;
        this.title = title;
        addTableModelListener(this);
    }
    
    @Override
    public void tableChanged(TableModelEvent e) {
        System.out.println("test");
    }
    
    @Override
    public void setValueAt(Object value,int row, int column) {
        data[row][column] = value;
        fireTableDataChanged();
    }
    } 
    Je suis pas sure de l'ordre dans lequel on doit donner les coordonnée row et column. Alors je te propose d'essayer la solution ci dessus. et si ca marche pas essaye d'inverser row et column comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data[column][row] = value;
    Pour ton problème de calculer le montant en fonction la quantité et du prix. Tu peux le faire dans la méthode setValue. en testant si c'est la colonne prix ou la colonne quantité ont changé, alors calculer la colonne montant. En supposant que la colonne 3 soit le prix et la colonne 4 soit la quantité et la colonne 5 soit le montant. (Cette solution te permettera de ne pas utiliser un TableModelListener). Ca donnera ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Override
    public void setValueAt(Object value,int row, int column) {
        data[row][column] = value;
        if ((column==3) || (column==4)) {
            data[row][5] = data[row][3] * data [row][4]
        }
        fireTableDataChanged();
    }
    }
    Mais les cellulles de ta JTable doivent être editable pour pouvoir les modifier. Par defaut les cellulles d'un AbstractTableModel ne sont pas Editable (voir ici). Tu peux les rendre editable en surchargeant la méthode isCellEditable et en retournant true si la colonne est égale à 3 ou à 4 (à titre d'example). comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Override
    public boolean isCellEditable(int row, int column) {
        if ((column==3) || (column==4)) {
            return true;
        }
        else {
            return false;
        }
    }
    Bon courage.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Rapide, clair, précis = Merci pour la réponse. Ca fonctionne !

    Il me manquait surtout l'ajout de la méthode fireTableDataChanged().

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut changer la valeur d'un case au fur et à mesure
    Bonjour
    voila je voudrais changer les valeurs de différents cases de mon tableau.
    Mon programme est un compteur de points pour le tennis. Je précise que je suis sous Java's Cool.
    J'ai donc créé une fenêtre dans laquelle j'ai affiché mon tableau:
    Nom : interface3.PNG
Affichages : 1049
Taille : 266,6 Ko

    voici mon code pour le tableau:
    Nom : tableau.PNG
Affichages : 1163
Taille : 27,6 Ko

    le programme demande qui a gagné le point via un readInteger et je voudrais que le point s'affiche dans la colonne "jeux" et dans la ligne du joueur correspondant.

    j’espère avoir été clair

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/03/2014, 23h31
  2. Mettre une Valeur dans un OptionBouton quand un autre OB est activé?
    Par muska78 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/06/2008, 10h51
  3. Réponses: 10
    Dernier message: 08/04/2008, 11h14
  4. Savoir quand une variable ou un tableau est vide
    Par cryptorchild dans le forum Langage
    Réponses: 1
    Dernier message: 17/02/2006, 08h40
  5. passer d'une cellule d'un tableau a une autre par lien hyper
    Par jack_1981 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 28/12/2005, 14h53

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