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

AWT/Swing Java Discussion :

Commander l'exécution du 'switch - cases' d'un JComboBox à partir d'un autre


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut Commander l'exécution du 'switch - cases' d'un JComboBox à partir d'un autre
    Bonjour.

    Dans une application Swing, j'ai deux JComboBox's (choixListeEnerg et choixPlagePuiss). Je souhaite que l'ActionEvent e résultant d'une sélection dans l'un d'eux (choixListeEnerg) provoque aussi l'exécution du code prévu dans le 'switch - cases' de l'autre (choixPlagePuiss); plus précisément l'exécution du code correspondant à la sélection préalablement faite dans cet autre, sans qu'il y ait un changement de sélection dans cet autre.
    Dans le 'switch - cases' du premier JComboBox (choixListeEnerg), je pensais mettre quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choixPlagePuiss.doClick();
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choixPlagePuiss.getSelectedItem().doClick();
    mais le précompilateur refuse que 'doClick()' soit appliqué à une sélection du JComboBox ou au JComboBox même.
    Comment faire ?

    Merci d'avance.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  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,

    Plus simple que de chercher à simuler l'interaction avec le composant, fait une méthode qui fait le traitement, que tu appelles dans la ou les méthodes où tu as besoin de faire ce traitement (dont l'une est celle de l'écouteur de changement de sélection de la combo).
    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 régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bonjour Joël Drigo,

    Mouais ... j'y avais pensé au départ mais ça me fait ajouter beaucoup de lignes de code, alors qu'un 'doClick()' eut été ici très élégant. Mais comme l'API de JComboBox ne prévoit pas '.doClick()', je serai bien obligé.
    J'abandonne aussi l'idée d'ajouter un 'doClick()' dans une classe personnelle héritant de JComboBox, ce qui aurait constitué un bon exercice de style.

    Merci pour ta réponse.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  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
    Je ne vois pas en quoi simuler une interaction "clic-souris" pourrait être plus élégante. A la base on à le traitement : l'UI n'est pas la base. D'autant plus qu'un changement de sélection dans une combo ne se fait pas par clic sur la combo, mais par action de sélection, qui peut être un clic sur un item dans la liste déroulante, mais également un appui sur les touches flêches bas et haut, ou un simple appel de méthode setSelectedIndex (ou setSelectedItem), ou une conséquence de la modification du modèle. Simuler un clic, ce serait un peu comme installer un bras robot qui appuie à intervalle régulier sur l'interrupteur pour faire clignoter une ampoule.

    Par ailleurs, je ne vois pas en quoi ça pourrait ajouter beaucoup de lignes de code. Eventuellement, si tu as mis tout le code traitement dans la méthode actionPerformed d'u listener, ce qu'il aurait fallu éviter dès le départ, il suffit de la déplacer dans une méthode de traitement (en la rendant indépendante de la combo) , faire une autre méthode de traitement de la donnée sélectionnée dans l'autre combo. Ensuite, faire une méthode qui appelle les deux et l'appeler dans l'autre combo. Ça doit représenter 4 ou 5 lignes de code (si tant est qu'on puisse compter les lignes de code en java...). Et je dirais même que si on devait multiplier les champs et avoir des traitements en commun des données saisies dans ces différents champs, combinés ou pas, il serait intéressant d'intégrer un vrai modèle sur le formulaire, ce qui rendrait, pour le coup, plus élégant le formulaire, sans écrire des centaines de lignes de code (compter une dizaine par champs, un setter, un getter, la déclaration de la variable de stockage...) plus une dizaine pour la gestion événementiel.

    POC d'illustration :

    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
    package demo;
     
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.EventListener;
     
    import javax.swing.JComboBox;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.event.EventListenerList;
     
    public class Formulaire extends JPanel {
     
        private static final long serialVersionUID = 1L;
     
        public enum IdData {
     
            DATA1,
            DATA2;
     
        }
     
        private DataModel dataModel;
        private Controller controller;
     
        private JComboBox<String> combo1;
        private JComboBox<String> combo2;
     
        /**
         * 
         */
        public Formulaire(String[] dataCombo1, String[] dataCombo2) {
            dataModel=new DataModel();
            controller=new Controller();
            setLayout(new GridLayout(2,2));
            add(new JLabel("Choix 1"));
            combo1=new JComboBox<>(dataCombo1);
            add(combo1);
            combo1.addActionListener(controller);
            add(new JLabel("Choix 2"));
            combo2=new JComboBox<>(dataCombo2);
            add(combo2);
            combo2.addActionListener(controller);
            dataModel.setData1((String) combo1.getSelectedItem());
            dataModel.setData2((String) combo2.getSelectedItem());        
            addChangeListener(new IDataModelChangeListener() {
     
                @Override
                public void valueChange(Object source, IdData id, Object oldValue,
                        Object newValue) {
                    switch (id) {
                    case DATA1:
                        if ( changed(combo1.getSelectedItem(), newValue) ) {
                            combo1.setSelectedItem(newValue);
                        }
                        break;
                    case DATA2:
                        if ( changed(combo2.getSelectedItem(), newValue) ) {
                            combo2.setSelectedItem(newValue);
                        }
                        break;
                    default:
                        break;
                    }
     
                }
     
            });
        }
     
        public String getData1() {
            return dataModel.getData1();
        }
     
        public String getData2() {
            return dataModel.getData2();
        }
     
        public void addChangeListener(IDataModelChangeListener listener) {
            dataModel.add(listener);
        }
     
        public void removeChangeListener(IDataModelChangeListener listener) {
            dataModel.remove(listener);
        }
     
        private static boolean changed(Object oldValue, Object newValue) {
            if ( oldValue==null ) {
                if ( newValue==null ) {
                    return false;
                }
                else {
                    return true;
                }
            }
            else if ( oldValue.equals(newValue)) {
                return false;
            }
            else {
                return true;
            }
        }
     
        private class DataModel {
     
            private EventListenerList listenerList = new EventListenerList();
     
            private String data1;
            private String data2;
     
            public void setData1(String data1) {
                Object old = this.data1;
                this.data1 = data1;
                fireEvent(IdData.DATA1, old, this.data1);
            }
     
            public String getData1() {
                return data1;
            }
     
            public void setData2(String data2) {
                Object old = this.data2;
                this.data2 = data2;
                fireEvent(IdData.DATA2, old, this.data2);
            }
     
            public String getData2() {
                return data2;
            }
     
            public void remove(IDataModelChangeListener listener) {
                listenerList.remove(IDataModelChangeListener.class,listener);
            }
     
            public void add(IDataModelChangeListener listener) {
                listenerList.add(IDataModelChangeListener.class,listener);
            }
     
            private void fireEvent(IdData dataId, Object oldValue, Object newValue) {
                if ( !changed(oldValue,newValue) ) {
                    return;
                }
                for(IDataModelChangeListener listener : listenerList.getListeners(IDataModelChangeListener.class) ) {
                    listener.valueChange(Formulaire.this, dataId, oldValue, newValue);
                }
            }
     
        }
     
        public static interface IDataModelChangeListener extends EventListener {
     
            public void valueChange(Object source, IdData id, Object oldValue, Object newValue);
     
        }
     
        private class Controller implements ActionListener {
     
            @Override
            public void actionPerformed(ActionEvent e) {
                if ( e.getSource()==combo1 ) {
                    dataModel.setData1((String) combo1.getSelectedItem());
                }
                else if ( e.getSource()==combo2 ) {
                    dataModel.setData2((String) combo2.getSelectedItem());
                }
            }
     
        }
     
    }
    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
    package demo;
     
    import java.awt.BorderLayout;
     
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
     
    import demo.Formulaire.IDataModelChangeListener;
    import demo.Formulaire.IdData;
     
    public class DemoFormulaire extends JFrame {
     
        private static final long serialVersionUID = 1L;
     
        private Formulaire formulaire;
     
        public DemoFormulaire() {
            formulaire = new Formulaire(new String[]{"Machin1","Machin2","Machin3"}, new String[]{"Truc1","Truc2","Truc3"});
        }
     
        public void show() {
            JFrame frame = new JFrame("Démo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
     
            frame.getContentPane().setLayout(new BorderLayout());
            frame.getContentPane().add(formulaire, BorderLayout.CENTER);
     
            formulaire.addChangeListener(new IDataModelChangeListener() {
     
                @Override
                public void valueChange(Object source, IdData id, Object oldValue,
                        Object newValue) {
                    if ( source==formulaire ) {
                        switch (id) {
                        case DATA1:
                            updateData1((String)newValue);
                            break;
                        case DATA2:
                            updateData2((String)newValue);
                            break;
                        default:
                            break;
                        }
                    }
                }
     
            });
     
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
     
        private void updateData1(String data) {
            traitement1(data);
        }
     
        private void updateData2(String data) {
            traitement2(data);
            traitement1(formulaire.getData1());
        }
     
        private void traitement1(String data) {
            System.out.printf("Je fait machin avec %s\n",data);
        }
        private void traitement2(String data) {
            System.out.printf("Je fait truc avec %s\n",data);
        }
     
     // méthode de test/démo
        public static void main(String[] args) {
     
            SwingUtilities.invokeLater(new Runnable() {
     
                @Override
                public void run() {
                    new DemoFormulaire().show();
                }
            });
        }
     
    }
    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 régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bonsoir Joël Drigo,

    Mais c'est bien sûr ... Sitôt dit, sitôt fait (il y a un mois déjà), et c'est propre.

    Merci bcp, notamment pour ton exemple de code,
    et mes je te prie de m'excuser d'avoir perdu cette réponse et ce remerciement de vue pendant plus d'un mois.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/08/2013, 16h50
  2. Réponses: 2
    Dernier message: 16/01/2008, 18h40
  3. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  4. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34
  5. Commande d'exécution d'une procedure stockée SQL sur vb
    Par tseg dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/11/2003, 12h47

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