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 :
j'obtient le résultat souhaité., jusqu'au là y'a aucun problème.
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; } } }
Je lance une recherche via un textField (j'exécute l'évènement :
le code de la fonction remplirTablePatients:
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 viderTable(spf) est le 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
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); } }
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.
Partager