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 actualisation des données JCombobox


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 24
    Points
    24
    Par défaut Problème actualisation des données JCombobox
    Bonjour,

    J'ai un petit problème au niveau de l'update des données de ma JComboBox. Je rempli celle-çi avec un findAll Dao de mes données. J'applique les méthodes CRUD pour ajouter/supprimer/modifier une donnée par ex update d'un nom : Lorsque je valide l'update, la donnée n'est mise à jour que quand je ferme et ré-ouvre la Jdialog (la modification n’apparaît donc pas immédiatement) J'utilise une JComboBox et un model qui se trouve dans une autre classe et qui hérite de DefaultComboBoxModel. Je précise les méthodes fonctionnes sans problème mais seulement après fermeture/réouverture de la Jdialog.

    Je poste le morceau de code avec l'insert de la donnée (ici ce sont des agents qui se caractérise par un nom,prénom,email) et la classe avec le model.

    Merci à vous,

    Charlys1333

    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
     
    agentDao.insert(agent);
    					//Récupération du nom et prénom du client pour le JOptionPane et la méthode afficher();
    					String nom = txtNom.getText();
    					String prenom = txtPrenom.getText();
    					afficher(nom,prenom);
    					//CompareTo
    					modele.addElement(agent);
    					comboAgent.setModel(modele);
    					Collections.sort(liste);
    					for (Agent agent2 : liste ){
    						modele.addElement(agent);
    					}
    					comboAgent.setModel(modele);
    					agentDao.commitTransaction();
    					flag = false;
    					agentDao.endTransaction();
     
    				}}
    			catch (MyException e1) {
    				System.out.println(e1.getGeneratedMessage());
    			}
    			finally {
    				if (flag) {
    					try {
    						agentDao.rollbackTransaction();
    						agentDao.endTransaction();
    					} catch (MyException e1) {
    						e1.printStackTrace();
    					}
    				}
    			}
    		}
    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
     
    public class ModelComboAgent extends DefaultComboBoxModel<Agent>  {
     
    	List<Agent> listeAgent = new ArrayList();
     
    	public ModelComboAgent(List listeAgent) {
    		// TODO Auto-generated constructor stub
    		//On hérite de DefaultComboBoxModel
    		//List des agents dans le constructeur, on peut aussi utiliser une classe pour la collection
    		super();
    		this.listeAgent = listeAgent;
    	}
     
    	public ModelComboAgent() {
    		// TODO Auto-generated constructor stub
    		//On hérite de DefaultComboBoxModel
    		super();
    	}
     
    	public void addAgent(Agent agent) {
    		listeAgent.add(agent);
    	}
     
    	public List<Agent> getListAgent() {
    		return listeAgent;
    	}
     
    	public void setListAgent(List<Agent> liste) {
    		this.listeAgent = listeAgent;
    	}
     
    //	public void ajouterElement(Agent agent){
    //		super.addElement(agent);
    //	}
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème vient du fait que tu remplaces complètement le fonctionnement implémenté dans le DefaultComboBoxModel. Le principe de base de ce fonctionnement est que le modèle doit prévenir la vue (la JComboBox)) que les données (et lesquelles) ont changées, lorsqu'elles changent (en envoyant des évènements adéquates).

    Soit tu te bases complètement sur le fonctionnement implémenté dans le modèle :

    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
    public class ModelComboAgent extends DefaultComboBoxModel<Agent>  {
     
    	public ModelComboAgent(List<Agent> listeAgent) {
    		super(new Vector<Agent>(listeAgent));
    	}
     
    	public ModelComboAgent() {
    		super();
    	}
     
    	public void addAgent(Agent agent) {
    		addElement(agent);
    	}
     
    	public List<Agent> getListAgent() {
    		List<Agent> agents = new ArrayList<Agent>(getSize());
    		for(int index=0; index<getSize(); index++ ) {
    			agents.add(getElementAt(index));
    		}
                    return Collections.unmodifiableList(agents); // on rend la liste non modifiable pour éviter que l'appelant croit qu'il peut modifier les agents dans le modèle par ce moyen
    	}
     
    	public void setListAgent(List<Agent> liste) {
    		removeAllElements();
    		for(Agent agent:liste) {
    			addElement(agent);
    		}
    	}
     
    }
    Soit tu implémentes la gestion évènementielle qui permet d'avertir la vue des changements. Mais ça fait beaucoup de méthodes à redéfinir pour que la classe travaille avec ta liste, plutôt qu'avec le vector interne. Le plus simple, à la limite, est de reprendre le source de java, et de remplacer le Vector interne par une List. La première solution, restant la plus simple, à mon avis.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Tout d'abord, merci d'avoir répondu à mon message. J'ai regardé au niveau du code que vous aviez ajouté. Il fonctionne dans le sens où un nouvel agent est bien ajouté dans la liste de la combo directement. Seul petit problème il n'est pas à la bonne place (Collections.sort(liste)) ne semble pas fonctionner. En fait la donnée s'ajoute mais on dirait que la suite ne se gère pas ...

    Ps : La donnée s'ajoute en fin de liste, après réouverture de la jdialog, elle se trouve à la bonne place. J'ai essayé avec la méthode revalidate et/ou repaint sur la combo mais repaint de toute façon n'est pas faite pour ça ...

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, et c'est normal.

    Si tu veux avoir un modèle de combo mutable, il faut gérer soi même le tri. Il n'y a pas, à ma connaissance, d'équivalent au RowSorter de la JTable, pour le JComboBox. Je suppose que ta liste est toujours correctement trié à la création du dialogue ce qui fait que cela fonction si tu fermes et réouvre le dialogue.

    Voici un code de modèle directement dérivé du DefaultComboBoxModel pour pouvoir le faire :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    /**
     * A sorted model for combo boxes, from the oracle jdk 1.7 code .
     *
     * @param <E> the type of the elements of this model
     *
     */ 
    public class SortedComboBoxModel<E> extends AbstractListModel<E> implements MutableComboBoxModel<E>, Serializable {
        /**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	Vector<E> objects;
        Object selectedObject;
    	private Comparator<? super E> comparator;
     
        /**
         * Constructs an empty DefaultComboBoxModel object.
         */
        public SortedComboBoxModel() {
            objects = new Vector<E>();
        }
     
        /**
         * Constructs a DefaultComboBoxModel object initialized with
         * an array of objects.
         *
         * @param items  an array of Object objects
         */
        public SortedComboBoxModel(final E items[]) {
            objects = new Vector<E>(items.length);
     
            int i,c;
            for ( i=0,c=items.length;i<c;i++ )
                objects.addElement(items[i]);
     
            if ( getSize() > 0 ) {
                selectedObject = getElementAt( 0 );
            }
        }
     
     
     
        /**
         * Constructs a DefaultComboBoxModel object initialized with
         * a vector.
         *
         * @param v  a Vector object ...
         */
        public SortedComboBoxModel(Vector<E> v) {
            objects = v;
     
            if ( getSize() > 0 ) {
                selectedObject = getElementAt( 0 );
            }
        }
     
        /**
         * Constructs an empty DefaultComboBoxModel object.
         */
        public SortedComboBoxModel(Comparator<? super E> comparator) {
        	this.comparator=comparator;
            objects = new Vector<E>();
        }
     
        /**
         * Constructs a DefaultComboBoxModel object initialized with
         * an array of objects.
         *
         * @param items  an array of Object objects
         */
        public SortedComboBoxModel(final E items[], Comparator<? super E> comparator) {
        	this.comparator=comparator;
            objects = new Vector<E>(items.length);
     
            int i,c;
            for ( i=0,c=items.length;i<c;i++ )
                objects.addElement(items[i]);
     
            if ( comparator!=null ) {
            	Collections.sort(objects, comparator);
            }
     
            if ( getSize() > 0 ) {
                selectedObject = getElementAt( 0 );
            }
        }
     
        /**
         * Constructs a DefaultComboBoxModel object initialized with
         * a vector.
         *
         * @param v  a Vector object ...
         */
        public SortedComboBoxModel(Vector<E> v, Comparator<? super E> comparator) {
        	this.comparator=comparator;
            objects = v;
            if ( comparator!=null ) {
            	Collections.sort(objects, comparator);
            }
     
            if ( getSize() > 0 ) {
                selectedObject = getElementAt( 0 );
            }
        }
     
        // implements javax.swing.ComboBoxModel
        /**
         * Set the value of the selected item. The selected item may be null.
         * <p>
         * @param anObject The combo box value or null for no selection.
         */
        public void setSelectedItem(Object anObject) {
            if ((selectedObject != null && !selectedObject.equals( anObject )) ||
                selectedObject == null && anObject != null) {
                selectedObject = anObject;
                fireContentsChanged(this, -1, -1);
            }
        }
     
        // implements javax.swing.ComboBoxModel
        public Object getSelectedItem() {
            return selectedObject;
        }
     
        // implements javax.swing.ListModel
        public int getSize() {
            return objects.size();
        }
     
        // implements javax.swing.ListModel
        public E getElementAt(int index) {
            if ( index >= 0 && index < objects.size() )
                return objects.elementAt(index);
            else
                return null;
        }
     
        /**
         * Returns the index-position of the specified object in the list.
         *
         * @param anObject
         * @return an int representing the index position, where 0 is
         *         the first position
         */
        public int getIndexOf(Object anObject) {
            return objects.indexOf(anObject);
        }
     
        // implements javax.swing.MutableComboBoxModel
        public void addElement(E anObject) {
        	if ( comparator!=null ) {
        		int index = insertSortedElement(anObject);
     
    	        if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
    	            setSelectedItem( anObject );
    	        }
        	}
        	else {
    	        objects.addElement(anObject);
    	        fireIntervalAdded(this,objects.size()-1, objects.size()-1);
    	        if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
    	            setSelectedItem( anObject );
    	        }
        	}
        }
     
        private int insertSortedElement(E anObject) {
        	int size = getSize();
    		int index;
    		for (index = 0; index < size; index++) {
    			E o = getElementAt( index );
     
    			if (comparator.compare(o, anObject) > 0) {
    				break;
    			}
    		}
     
    		objects.add(index, anObject);
            fireIntervalAdded(this, index, index);
            return index;
     
    	}
     
    	// implements javax.swing.MutableComboBoxModel
        public void insertElementAt(E anObject,int index) {
        	if ( comparator!=null ) {
        		insertSortedElement(anObject);
        	}
        	else {
    	        objects.insertElementAt(anObject,index);
    	        fireIntervalAdded(this, index, index);
        	}
        }
     
        // implements javax.swing.MutableComboBoxModel
        public void removeElementAt(int index) {
            if ( getElementAt( index ) == selectedObject ) {
                if ( index == 0 ) {
                    setSelectedItem( getSize() == 1 ? null : getElementAt( index + 1 ) );
                }
                else {
                    setSelectedItem( getElementAt( index - 1 ) );
                }
            }
     
            objects.removeElementAt(index);
     
            fireIntervalRemoved(this, index, index);
        }
     
        // implements javax.swing.MutableComboBoxModel
        public void removeElement(Object anObject) {
            int index = objects.indexOf(anObject);
            if ( index != -1 ) {
                removeElementAt(index);
            }
        }
     
        /**
         * Empties the list.
         */
        public void removeAllElements() {
            if ( objects.size() > 0 ) {
                int firstIndex = 0;
                int lastIndex = objects.size() - 1;
                objects.removeAllElements();
                selectedObject = null;
                fireIntervalRemoved(this, firstIndex, lastIndex);
            } else {
                selectedObject = null;
            }
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Ok, je vais analyser et tester et ensuite je ferai un feeback.

    D'avance merci.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    J'ai finalement résolu mon problème mais en restant sur une ArrayList et non un Vector (qui en est l’ancêtre) En fait maintenant, mon modèle hérite d'AbstractListModel et implements ComboBoxModel. Avec la méthode fireContentsChanged c'est elle qui gère les éventements sur les modification du contenu.

    Merci encore !

    Charlys1333

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

Discussions similaires

  1. [AC-2013] Problème d'actualisation des données
    Par Yunie68 dans le forum Access
    Réponses: 0
    Dernier message: 24/04/2014, 14h29
  2. [XL-2007] problème pour actualiser des données sur un TCD
    Par Mam972 dans le forum Excel
    Réponses: 1
    Dernier message: 22/03/2012, 19h50
  3. Réponses: 2
    Dernier message: 08/06/2011, 17h25
  4. [2.1] Problème d'actualisation des données de mon pool de connection
    Par Chinow dans le forum Glassfish et Payara
    Réponses: 0
    Dernier message: 04/08/2009, 10h50
  5. MRTG et crontab : problème d'actualisation des données
    Par superjoe dans le forum Administration système
    Réponses: 2
    Dernier message: 06/05/2007, 13h45

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