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 et évènement actionPerformed


Sujet :

Composants Java

  1. #1
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut JComboBox et évènement actionPerformed
    Bonjour,

    j'ai un JPanel contenant 2 JComboBox de String, qui sont renseignées avec le même modèle de chaines de caractères.
    Ainsi lorsque le modèle change, le contenu des 2 JComboBox est mis à jour en même temps.

    Mon problème est que lorsque je sélectionne un élément d'une des JComboBox, l'autre reçoit un aussi évènement, et se positionne sur le même index que sa "copine".

    Au début, le traitement d'évènements se faisait par une classe commune:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cbxFiltreSites = new JComboBox<String>( modeleListeSites );
    cbxFiltreSites.addActionListener( this ); // this étant la classe conteneur, implémentant ActionListener
    
    cbxAffectation = new JComboBox<String>( modeleListeSites );
    cbxAffectation .addActionListener( this );
    
    /.../
    @Override
    public void actionPerformed( ActionEvent aEvt ) {
      /.../
    }
    Donc j'ai décidé de séparer la gestion des évènements, et donné une classe de gestion pour chaque JComboBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cbxFiltreSites = new JComboBox<String>( modeleListeSites );
    cbxFiltreSites.addActionListener( new CEvenementFiltre());
     
    cbxAffectation = new JComboBox<String>( modeleListeSites );
    cbxAffectation .addActionListener( new CEvenementAffectation());
    Rien n'y fait, les 2 ComboBox sont toujours couplées.

    Pour finir, j'ai décidé de ne plus leur donner le même modèle de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cbxFiltreSites = new JComboBox<String>( modeleListeA );
    cbxFiltreSites.addActionListener( new CEvenementFiltre());
     
    cbxAffectation = new JComboBox<String>( modeleListeB );
    cbxAffectation .addActionListener( new CEvenementAffectation());
    Enfin, elles ne sont plus couplées !!???

    Je ne vois pas le rapport entre le modèle de String, et le fait qu'un évènement d'une ComboBox se répercute sur l'autre... Vous avez déjà vu ça ?
    @ bientôt...

    Salut & @+ sur 3W!

  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,

    Tout est dans l'Interface qui définit un modèle de JComboBox :
    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
    public interface ComboBoxModel<E> extends ListModel<E> {
     
      /**
       * Set the selected item. The implementation of this  method should notify
       * all registered <code>ListDataListener</code>s that the contents
       * have changed.
       *
       * @param anItem the list object to select or <code>null</code>
       *        to clear the selection
       */
      void setSelectedItem(Object anItem);
     
      /**
       * Returns the selected item
       * @return The selected item or <code>null</code> if there is no selection
       */
      Object getSelectedItem();
    }
    On voit que c'est le modèle de la combo qui gère la sélection : donc même modèle, même sélection.
    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 expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonsoir est merci pour cette réponse.

    jusqu'à aujourd'hui, je pensais que le modèle ne s'occupait que de fournir la liste des Items...
    bon ben je n'ai plus qu'à affecter des listes de chaines de caractères différentes pour chaque comboBox.

    Merci beaucoup.
    Bonne nuit.
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    je reviens sur ce sujet, avec la question suivante:

    y a-t-il moyen de découpler les évènements de sélection, afin de garder le même modèle de liste pour les 2 ComboBox, et de permettre la sélection d'un item dans l'une, sans que l'autre ne change ?
    @ bientôt...

    Salut & @+ sur 3W!

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui, il y a moyen.

    Tu crée un ListModel commun (interface ListModel)

    et tu crée deux instance de ComboboxModel. Toutes les méthodes de ListModel dans ComboboxModel délèguent à l'instance de ListModel, mais la Selection reste locale.

    Lorsqu'on change la sélection dans ton ComboboxModel, n'oublie pas de lancer un évent contentChanged

  6. #6
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour tchize_

    merci pour ce tuyau. J'avais un peu cherché du côté de ListModel, mais je suis resté calé sur la façon d'affecter une ListModel à une JComboBox.

    Voici ce que j'avais essayé de faire:
    #1 Création d'une classe implémentant ListModel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class monModeleString implements ListModel<String>
    {
      private ArrayList<String> listeModele;
     
      /...
      @Override et Cie
      .../
    }
    #2 Création des 2 JComboBox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    monModeleString modeleSites = new monModeleString();
     
    DefaultComboBoxModel<String> dCM1 = new DefaultComboBoxModel<String>();
    DefaultComboBoxModel<String> dCM2 = new DefaultComboBoxModel<String>();
     
    JComboBox1 = new JComboBox<String>( dCM1 );
    JComboBox2 = new JComboBox<String>( dCM2 );
    Je n'arrive pas à "expliquer" à dCM1 et dCM2, qu'ils doivent chercher leurs données dans modeleSites.

    Le constructeur de DefaultComboBoxModel accepte éventuellement un tableau en paramètres, sauf que le tableau (qui sera issu de l'ArrayList listeModele, va varier constamment, et n'est pas figé.

    Voilà, la situation est bloquée pour moi.
    @ bientôt...

    Salut & @+ sur 3W!

  7. #7
    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
    Ton implémentation de ListModel doit également implémenter ComboBoxModel pour pouvoir être utilisée comme modèle de combo. Plus MutableComboBoxModel pour pouvoir être modifiée.

    Une solution plus simple (avec moins de code à écrire) serait de faire une classe qui encapsule les deux modèles, avec les ordres d'ajout et de suppression et modifie les 2 instances de modèles. Ensuite tu manipules ta liste via cette classe, comme si c'était ta liste unique.
    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.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Je n'arrive pas à "expliquer" à dCM1 et dCM2, qu'ils doivent chercher leurs données dans modeleSites.
    Tu réfléchit à l'envers. Ce n'est pas une implémentation custom de ListModel que tu dois créer (tu peux très bien utilise DefaultListModel), c'est une implémentation custom de ComboboxModel que tu dois implémenter (pas besoin du mutable au passage):


    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
    public class MyComboModel<T> extends DefaultComboBoxModel<T>{
          ListModel<T> listModel;
          public MyComboModel(ListModel<T> listModel) {this.listModel = listModel;}
          public void	addListDataListener(ListDataListener l){
              super.addListDataListener(l);
              listModel.addListDataListener(l);
          }
          public void removeListDataListener(ListDataListener l){
              super.removeListDataListener(l);
              listModel.removeListDataListener(l);
          }
          public T getElementAt(int index) {
              return listModel.getElementAt(index);
          }
          public int getSize(){
              return listModel.getSize();
          }
    }

  9. #9
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour et merci pour vos réponses.

    Un merci particulier à tchize_, ce code est impressionnant par sa simplicité et son efficacité. Encore une fois, JAVA me laisse baba
    @ bientôt...

    Salut & @+ sur 3W!

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

Discussions similaires

  1. Probleme jcombobox actionperformed
    Par skouza dans le forum Composants
    Réponses: 0
    Dernier message: 04/04/2011, 09h36
  2. [JComboBox] ne pas déclencher d'événement sur un addItem
    Par Djakisback dans le forum Composants
    Réponses: 9
    Dernier message: 28/05/2008, 17h39
  3. JComboBox évènement flèche à droite
    Par troussepoil dans le forum Composants
    Réponses: 6
    Dernier message: 20/05/2008, 10h17
  4. événement lié à JComboBox
    Par yasmine* dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 31/05/2007, 23h21
  5. [JComboBox] Problème avec un événement
    Par cysboy dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/03/2007, 15h34

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