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 et TableModelListener


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut JTable et TableModelListener
    Bonsoir tout le monde,

    Voilà j'ai un petit problème avec mon model de table et ma classe JTable qui implémente TableModelListener. Le problème est certainement très bête mais je bute dessus depuis un petit moment alors un oeil neuf pourra certainement m'aiguiller. Je m'explique, j'ai deux classes, une classe monTableau qui hérite de JTable et qui implémente tableModelListener pour la modification des valeurs dans ma table et mon modele de table.

    voici la classe modele du tableau :

    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
     
    package JAlgo;
     
    /**
     *
     * @author fterm
     */
     
    import javax.swing.event.*;
    import javax.swing.table.*;
     
    public class tableBoucleModele extends AbstractTableModel{
     
        private String[] nomColonnes;
        private Object[][] data;
     
        public tableBoucleModele(){
     
            nomColonnes = new String[2];
            nomColonnes[0] = "Boucle";
            nomColonnes[1] = "Condition";
            data = new Object[50][2];
        }
     
        public int getColumnCount(){
            return(nomColonnes.length);
        }
     
        public int getRowCount(){
     
            return(data.length);
        }
     
        public String getColumnName(int col){
     
            return(nomColonnes[col]);
        }
     
     
        public Object getValueAt(int row, int col){
     
            return(data[row][col]);
        }
     
        public void setValueAt(Object value, int row, int col){
     
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
     
        public void clean(){
     
            data = new Object[50][2];
        }
     
        public boolean isCellEditable(int row, int col) {
     
            return true;
     
        }
     
    }
    et voici le code relatif à la classe tableau :

    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
     
     
     
    package JAlgo;
     
    /**
     *
     * @author fterm
     */
    import javax.swing.event.*;
    import javax.swing.table.*;
    import javax.swing.*;
     
    public class TableBoucle extends JTable implements TableModelListener{
     
        public TableBoucle(){
     
            super(new tableBoucleModele());
        }
     
        public void tableChanged(TableModelEvent e){
     
            int row = e.getFirstRow();
            int column = e.getColumn();
            tableBoucleModele model = (tableBoucleModele)e.getSource();
            String columnName = model.getColumnName(column);
            Object data = model.getValueAt(row, column);
            System.out.println(data);
        }
     
    }
    Ces deux classes sont utilisées pour modéliser un tableau dans une interface swing (JFrame).
    Voici l'erreur de compilation qui apparait :

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at JAlgo.tableBoucleModele.getColumnName(tableBoucleModele.java:35)
    at JAlgo.TableBoucle.tableChanged(TableBoucle.java:28)
    at javax.swing.JTable.setModel(JTable.java:2878)
    at javax.swing.JTable.<init>(JTable.java:417)
    at javax.swing.JTable.<init>(JTable.java:357)
    at JAlgo.TableBoucle.<init>(TableBoucle.java:20)
    at JAlgo.IHM.<init>(IHM.java:137)
    at JAlgo.IHM.main(IHM.java:422)

    Merci pour tout conseil ou aide apporté.
    Cordialement,
    fterm

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    J'ai déjà eu ce genre de problèmes.

    Pour le résoudre, j'ai créé la JTable (via un super() sans argument dans ton cas) et ensuite, j'ai ajouté le TableModel (via setTableModel(new TableBoucleModel()) ).

  3. #3
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    deux remarques :

    1. JTable implémente déjà TableModelListener, donc, si tu définis toi aussi tableChanged(TableModelEvent e) sans appeler 'super', ca peut faire mal.
    2. Ton problème ne serait-il pas du au fait que tu lances tous tes traitements graphiques hors EDT?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut
    merci pour ces réponses rapides, je test les suggestions et je vous dis quoi.
    Cordialement,
    fterm

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 31
    Par défaut
    J'ai pris en compte vos remarques et modifier mon code de la façon 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package JAlgo;
     
    /**
     *
     * @author fterm
     */
    import javax.swing.event.*;
    import javax.swing.table.*;
    import javax.swing.*;
     
    public class TableBoucle extends JTable implements TableModelListener{
     
        private tableBoucleModele model;
     
        public TableBoucle(){
     
            super();
            model = new tableBoucleModele();
            model.addTableModelListener(this);
            this.setModel(model);
     
        }
     
        public void tableChanged(TableModelEvent e){
     
            int row = e.getFirstRow();
            int column = e.getColumn();
            tableBoucleModele model = (tableBoucleModele)e.getSource();
            String columnName = model.getColumnName(column);
            Object data = model.getValueAt(row, column);
            System.out.println(data);
        }
     
    }
    et j'ai comme erreur a l'execution :

    Exception in thread "main" java.lang.ClassCastException: javax.swing.table.DefaultTableModel
    at JAlgo.TableBoucle.tableChanged(TableBoucle.java:33)
    at javax.swing.JTable.setModel(JTable.java:2878)
    at javax.swing.JTable.<init>(JTable.java:417)
    at javax.swing.JTable.<init>(JTable.java:344)
    at JAlgo.TableBoucle.<init>(TableBoucle.java:22)
    at JAlgo.IHM.<init>(IHM.java:137)
    at JAlgo.IHM.main(IHM.java:422)
    Java Result: 1

    Je vous remercie.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Bonjour,

    Tout d'abord, il parait très bizarre de créer le modèle dans le constructeur de la table. C'est pas très "propre" on va dire (par rapport au modèle MVC que ces classes permettent d'implémenter) .

    Pour l'erreur de ton premier post, le problème vient de la méthode getColumnName() à laquelle tu fournit un entier, disons "col" probablement incorrect. Dans ton cas, "col" doit valoir impérativement 0 ou 1 car sinon la valeur dans le tableau nomColonne n'est pas défini. Un petit test sur la valeur de cet entier t'éviteras des surprises.

    Pour ton deuxième test, il semblerait que e.getSource ne soit pas une instance du type tableBoucleModel. Tu devrais vérifier en faisant un petit test. De plus, tu redéfinis une variable de classe et ca ca va te poser un problème. (model existe en variable de classe, et tu redonnes le meme nom à ta variable locale = problème)

    ps : les noms de classe devraient commencer par majuscules (tableBoucleModele -> TableBoucleModele)

    Cdlt

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

Discussions similaires

  1. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  2. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  3. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  4. JBuilder7 & JTable Colonne alignement
    Par Tonton Luc dans le forum JBuilder
    Réponses: 5
    Dernier message: 06/11/2002, 17h32
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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