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 :

Mise à jour d'un JTable avec JComboBox


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut Mise à jour d'un JTable avec JComboBox
    Bonjour a ts les développeurs de developpez.net ,

    J'ai un petit souci dans mon application avec ma Jtable qui est lié à un ComboBox qui de son tour lié à une base de données :



    Le souci est que quand je change l'item dans le ComboBox, le Jtable ne se met pas à jour avec , et voila le code que j'ai implémenté :

    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
    private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {                                            
            EtudiantDAO etu = new EtudiantDAO();
            Model m= new Model();
            String[] nomsColonnes = {"Student's Id", "Student's Name","Student's city"};
                String city= jComboBox1.getSelectedItem().toString();
                ArrayList<Etudiant> liste1= etu.select(3, city);
                Object[][] data= new Object[liste1.size()][3];
                for (int i=0;i<liste1.size();i++) {
                    m.addEtudiant(liste1.get(i));
                data[i][0]=liste1.get(i).getNumEtu();
                data[i][1]=liste1.get(i).getNomEtu();
                data[i][2]=liste1.get(i).getVilleEtu();
            }
               JTable table= new JTable(data,nomsColonnes);
               m.fireTableDataChanged();
     
               jPanel4.add(BorderLayout.NORTH,table.getTableHeader());
               jPanel4.add(BorderLayout.CENTER,table);
     
        }
    P.S : Je veux le faire sans utiliser le Design Pattern Observer, ni aucun autre design pattern, comment puis je le faire ?

    Merci D'avance pour l'aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Pourquoi fais-tu m.fireTableDataChanged(); juste après la construction de ton JTable ? Le setModel est-il invoqué dans ton code ? as-tu essayé de repaint la frame ?

  3. #3
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Bn oui, j'ai une classe Model qui étend AbstractTableModel, et il y a un set model.
    Le firedataTableChanged pour noter aux listeners que la valeur des cellules peut changer ainsi que le nombre des lignes et que la JTable doit redessiner la table de la source

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par Akhilleus Voir le message
    Le firedataTableChanged pour noter aux listeners que la valeur des cellules peut changer ainsi que le nombre des lignes et que la JTable doit redessiner la table de la source
    Ce n'est pas ça : firedataTableChanged notifie que la table a changé, et ce n'est pas le cas donc ne change rien.

    Concernant le repaint, ça donne quelque chose ? getValueAt est-il réinvoqué ?

  5. #5
    Membre actif
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Bn ,concernant le getvalueat , oui et voila le code de ma classe Model :
    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
    package logiqueapplicative;
    import DAO.Etudiant;
    import java.util.ArrayList;
    import javax.swing.event.EventListenerList;
    import javax.swing.table.AbstractTableModel;
     
     
    public class Model extends AbstractTableModel{
        private ArrayList<Etudiant> data;
     
        public Model() {
            data= new ArrayList<Etudiant>();
     
        }
     
        @Override
        public int getRowCount() {
          return data.size();
        }
     
        @Override
        public int getColumnCount() {
            return 3;
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
           Etudiant e= data.get(rowIndex);
           return null;
        }
     
        public ArrayList<Etudiant> getData() {
            return data;
        }
         public void setData(ArrayList<Etudiant> data) {
            this.data= data;
        }
         public void addEtudiant(Etudiant e){
             data.add(e);
             setValueAt(e.getNumEtu(), data.size()-1, 0);
             setValueAt(e.getNomEtu(), data.size()-1, 1);
             setValueAt(e.getVilleEtu(), data.size()-1, 2);
             fireTableRowsInserted(data.size()-1, data.size());
             fireTableDataChanged();
         }
          public void removeEtudiant(int i){
             data.remove(i);
             fireTableRowsDeleted(i, i);
             fireTableDataChanged();
         }
     
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            super.setValueAt(aValue, rowIndex, columnIndex);
            fireTableDataChanged();
        }
     
     
     
    }
    et concernant le firedataTableChanged, c pas moi qui dis, c la documentation java :

    fireTableDataChanged

    public void fireTableDataChanged()

    Notifies all listeners that all cell values in the table's rows may have changed. The number of rows may also have changed and the JTable should redraw the table from scratch. The structure of the table (as in the order of the columns) is assumed to be the same.

    See Also:
    TableModelEvent,EventListenerList,JTable.tableChanged(TableModelEvent)

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Citation Envoyé par Akhilleus Voir le message

    Notifies all listeners that all cell values in the table's rows may have changed.
    Signifie que les lignes ont propablement changé (et non ne vont pas chager).

    getValeuAt est la méthode invoquée par le gestionnaire de la fenêtre pour la redéssiner. En gros elle renvoie la valeur à afficher à la ligne et la colonne envoyé en param. Chez toi, on déclare un Etudiant que l'on va chercher dans le modèle mais on renvoie null. Donc si la méthode est bien invaoquée, la table se vide. Si ce n'est pas le cas c'est qu'elle n'est pas invoqué.
    Dans ce cas, après la mise à jour des données, il faut faire un fireTableDataChanged().
    Dans tous les cas, il faut redéfinir getValueAt.
    Il faut envoyé l'attribut de ton objet Etudiant en fonction de la colonnes. Mais pour ne pas d'embêter, mets un tableau de String dans le modèle et renvoie le contenu de la cellule à la ligne et la colonne renseignées. Après, il faut voir comment tu le remplis (ce sera comme pour la création de l'ArrayList je pense).

Discussions similaires

  1. mise à jour d'une JTable ?
    Par Sakalam dans le forum Composants
    Réponses: 11
    Dernier message: 15/09/2006, 15h06
  2. Mise à jour d'une table avec une autre
    Par Lucien dans le forum SQL
    Réponses: 2
    Dernier message: 20/04/2006, 10h46
  3. [DOM4J] Mise à jour des docs xml avec dom4j
    Par kodo dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 21h48
  4. Mise à jour dans un formulaire avec condition
    Par Bourni dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2006, 22h13
  5. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46

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