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 :

Problème d'ajout de ligne dans un JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut Problème d'ajout de ligne dans un JTable
    Bonjour,
    je travaille sur une application swing et j'ai un problème.

    J'ai un JFrame qui contient un Jtable qui est remplit a partir d'une base de données.

    au lancement de l'application tout marche bien et la table est bien rempli par les éléments de la base.

    je sélectionne une ligne de la table : je lance le listner suivant :

    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
    public void valueChanged( ListSelectionEvent event )
          {
     	 // See if this is a valid table selection
    	 if(event.getSource() == this.listPatientsTable.getSelectionModel()
    			&& event.getFirstIndex() >= 0 )
    	     {
                  if(flagRelance){
                      // Get the data model for this table
                      TableModel model = (TableModel)this.listPatientsTable.getModel();
                      //Récupérer l'id du patient sélectionné.
                      String idSelectionne = (String)model.getValueAt(
                      this.listPatientsTable.getSelectedRow(),
                      0).toString();
                      //Récupérer le patient séléctionné.
                      flagRelance = false;
                      TPatientBean tpb = getFichePatientControl().getPatientById(idSelectionne);
                      if(tpb != null){
                          getFichePatientControl().afficherPatientDansFormulaire(this,tpb);
                      }else{
     
                      }
     
                  }else{
                     flagRelance = true;
                  }
    	    }
         }
    j'obtient le résultat souhaité., jusqu'au là y'a aucun problème.

    Je lance une recherche via un textField (j'exécute l'évènement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     private void rechercheTextFieldKeyReleased(java.awt.event.KeyEvent evt) {                                               
            getFichePatientControl().remplirTablePatients(this, true, this.getRechercheTextField().getText().trim());
        }
    le code de la fonction remplirTablePatients:

    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
       public void remplirTablePatients(SuiviPatientlFrame spf,boolean viderTable,String nomPrenom){
         //Remplir la table des patients.
         List patients = null;
         try{
                 if(viderTable){
                     viderTable(spf);
                 }
                 if(nomPrenom != null){
                     patients = Utilitaire.getPatientRecherche(getAllPatients(), nomPrenom);
                 }else{
                     patients = getAllPatients();
                 }
                 if(patients != null && patients.size()>0){
                     Iterator it = patients.iterator();
                     while(it.hasNext()){
                         TPatientBean tpb = (TPatientBean)it.next();
                         Object[] rowData = {tpb.getIdPatient(),tpb.getNomPatient() ,tpb.getPrenomPatient(),
                         tpb.getTelephoneMobilePatient(),tpb.getTelephoneFixePatient(),
                         tpb.getDateProchainRendezVousPatient()};
                         ((DefaultTableModel)(spf.getListPatientsTable().getModel())).addRow(rowData);
                     }
                 }
         }catch (Exception ex) {
             System.out.println("Le probleme rencontré est::");
             ex.printStackTrace();
             Utilitaire.afficherDialogue(spf);
          }
        }
    -Le code de la fonction viderTable(spf) est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public void viderTable(SuiviPatientlFrame suiviPatientlFrame){
            while (suiviPatientlFrame.getListPatientsTable().getRowCount() > 0) {
                 System.out.println("Avant suppression, le nombr des lignes est ::::" +((DefaultTableModel) suiviPatientlFrame.getListPatientsTable().getModel()).getRowCount());
                ((DefaultTableModel) suiviPatientlFrame.getListPatientsTable().getModel()).removeRow(0);
                 System.out.println("Apres suppression ::le nombr des lignes est ::::" +((DefaultTableModel) suiviPatientlFrame.getListPatientsTable().getModel()).getRowCount());
            }
        }

    -Donc après le lancement de la recherche via le textField, par exemple si je tape "XXX" je veux redessiner la table et y insérer les lignes renvoyées par le requête de recherche par "xxx" (c'est l'objectif de la fonction remplirTable).


    Le problème c'est que lorsque je vide la table par la fonction (viderTable) et je veux insérer les nouvelle lignes (résultats de la recherche par "xxx")par ((DefaultTableModel)(spf.getListPatientsTable().getModel())).addRow(rowData); de la fonction remplirTable, j'obtient une exption -1.

    Voici le résultat affiché dans la console:
    Avant suppression, le nombr des lignes est ::::3
    Apres suppression ::le nombr des lignes est ::::2
    Avant suppression, le nombr des lignes est ::::2
    Apres suppression ::le nombr des lignes est ::::1
    Avant suppression, le nombr des lignes est ::::1
    Apres suppression ::le nombr des lignes est ::::0
    Le probleme rencontré est::
    java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.Vector.elementAt(Vector.java:430)
    at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
    at rachid.cabinetMedical.presentation.ecrans.SuiviPatientlFrame.valueChanged(SuiviPatientlFrame.java:500)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194)
    at javax.swing.DefaultListSelectionModel.insertIndexInterval(DefaultListSelectionModel.java:615)
    at javax.swing.JTable.tableRowsInserted(JTable.java:4468)
    at javax.swing.JTable.tableChanged(JTable.java:4404)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:215)
    at javax.swing.table.DefaultTableModel.insertRow(DefaultTableModel.java:359)
    at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:333)
    at javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:344)
    at rachid.cabinetMedical.presentation.controlEcrans.FichePatientControl.remplirTablePatients(FichePatientControl.java:185)
    at rachid.cabinetMedical.presentation.ecrans.SuiviPatientlFrame.rechercheTextFieldKeyReleased(SuiviPatientlFrame.java:437)
    at rachid.cabinetMedical.presentation.ecrans.SuiviPatientlFrame.access$600(SuiviPatientlFrame.java:40)
    at rachid.cabinetMedical.presentation.ecrans.SuiviPatientlFrame$7.keyReleased(SuiviPatientlFrame.java:286)
    at java.awt.Component.processKeyEvent(Component.java:6224)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2789)
    at java.awt.Component.processEvent(Component.java:6040)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
    at java.awt.Component.dispatchEventImpl(Component.java:4502)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    Alors la table est bien vide puisque le nombre des lignes est devenu 0, je vois pas pourquoi il me laisse pas insérer des nouvelles lignes.

    J'espère que j'ai bien expliqué le problème.

    Merci pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.listPatientsTable.getSelectedRow(),
    Une fois que tu as vidé ta table, je ne suis pas certain que tu aies une ligne sélectionnée et que cette méthode renvoie donc une valeur cohérente.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Effectivement, tu as raison.
    En faîte il faut supprimer le listner si la table est vide et l'ajouter après le remplissage de la table.
    Moi je l'ai ajouté au moment de construction pour ça j'ai eu le problème.

    Merci infiniment pour la piste.

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

Discussions similaires

  1. [WD16] problème pour ajouter une ligne dans la table
    Par T1929D dans le forum WinDev
    Réponses: 3
    Dernier message: 02/08/2013, 22h39
  2. Problème d'ajout de ligne dans une JFrame
    Par nrgumn dans le forum Débuter
    Réponses: 2
    Dernier message: 04/01/2012, 06h29
  3. Ajout de ligne dans une JTable
    Par Aure7780 dans le forum Débuter
    Réponses: 12
    Dernier message: 05/08/2010, 16h23
  4. Problème d'ajout de ligne dans une datagridview
    Par mustapha_ess dans le forum C++/CLI
    Réponses: 1
    Dernier message: 23/07/2010, 16h16
  5. Comment ajouter une ligne dans un Jtable
    Par fefe69 dans le forum Composants
    Réponses: 1
    Dernier message: 10/03/2009, 11h57

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