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 :

[JComboBox] ne pas déclencher d'événement sur un addItem


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut [JComboBox] ne pas déclencher d'événement sur un addItem
    Salut,
    je mets à jour les items d'une JComboBox tous les x millisecondes. La méthode simplifiée que j'utilise est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    combobox.removeAllItems();
    combobox.addItem("data 1");
    combobox.addItem("data 2");
    etc.
    J'ai ajouté un ActionListener à la JComboBox, et je dois effectuer des actions dans actionPerformed(ActionEvent evt), le problème est que combobox.addItem(); déclenche un ActionEvent et la méthode est donc appelée à chaque fois que je modifie les items.
    Quelqu'un aurait-il une solution pour pallier à cela ?
    Y a-t-il un autre moyen de modifier dynamiquement les items d'une JComboBox sans que ça déclenche un événement ? J'ai regardé du côté du Model mais je n'ai rien trouvé.
    Merci ^^

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    C'est à toi, dans ton action listener, de faire le tri entre les action qui t'intéresse et celle qui t'intéressent pas. Désactiver tout est impossible, plus la simple et bonne raison que les classes s'occupant du rendu de la combobox doivent bien etre mise au courant du changement de contenu.

    Par contre, tu peux limiter les appels à une action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    combo.setModel(new DefaultComboBoxModel(Object[] items) );
    le modèle contiendrait ainsi déjà tous les éléments.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Je ne sais pas si j'ai bien compris, mais au lieu d'utiliser un ActionListener, tu peux utiliser un ItemListener.
    http://java.sun.com/docs/books/tutor...mlistener.html

    Tu pourras choisir l'ItemEvent qui te convient.

  4. #4
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Il s'agit d'un comportement non désactivable de la méthode addItem de JComboBox.
    Ce qu'il se passe c'est que si tu n'avais aucun élément dans ta liste puis que tu en rajoutes un, il va le sélectionner par défaut. Il se fiche que tu en rajoutes 3 autres par la suite, il t'aura sélectionné le premier automatiquement.

    La bonne solution, quoique qu'innélégante, est celle de tchize_, à savoir changer le model à chaque modification de la liste. Ou alors passer par ta propre implémentation du model.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ben elle est pas inélégante, au contraire, puisque visiblement sa logique est "on vire tout et on remet autre chose", le changement de modèle est justement ce qui est le plus propre

  6. #6
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ben elle est pas inélégante, au contraire, puisque visiblement sa logique est "on vire tout et on remet autre chose", le changement de modèle est justement ce qui est le plus propre
    Le plus propre c'est d'avoir sa propre implémentation du model.
    Changer de model à la volée, je ne le fais jamais.

    Avec JGoodies Bindings, je fournis un model particulier à la combo et ça me permet de changer dynamiquement et à tous moments les valeurs contenues. Aucun changement de model.

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

Discussions similaires

  1. impossible de déclencher un évènement sur un tree
    Par flamant dans le forum Ext JS / Sencha
    Réponses: 0
    Dernier message: 28/07/2010, 11h03
  2. Réponses: 3
    Dernier message: 06/05/2010, 10h59
  3. Déclencher un événement sur une propriété de ma classe
    Par Gregory.M dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/06/2009, 16h13
  4. Réponses: 1
    Dernier message: 27/05/2008, 08h44
  5. Réponses: 13
    Dernier message: 21/12/2005, 16h18

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