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 :

Deux listes dépendantes l'une de l'autre


Sujet :

Composants Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut Deux listes dépendantes l'une de l'autre
    Bonjour,

    voila mon probleme

    mon premier combobox BRAND contient :

    %
    AGFA
    HP
    BROTHER

    le deuxieme IND:

    %
    COPIER
    PRINTER
    FAX


    je voudrais que quand je choisi un element de IND, il reset la selection de BRAND (lstBrand.setSelectedIndex(0))

    et vice versa .


    le probleme est que quand setSelectedIndex(0) va avoir lieu , il va y avoir un event qui appele ma fonction execChangeBrand() ... et comme celle ci va vouloir faire le reset de IND .... je vais me retrouver dans une boucle infinie ou les deux liste se reset a tour de role .

    j ai pensé mettre un flag pour que l event appele la fonction execChangeXXX() que si isReseting=false , mais le probleme c'est que me fonctions exec sont des "SwingUtilities.invokeLater" ....

    donc je ne peux absolument pas me baser sur la valeur du flag .


    si qqn a compris ce que j'essaye d'expliquer, est ce que vous avez une solution à ca ???


    merci pour votre aide

  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,

    et si tu n'appelais le setSelectionIndex(0) sur l'autre combo que si la sélection actuelle est différente de "%" (ou autrement dit si l'index de la sélection est différente de 0) ?
    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 du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    merci merci merci

    ça semble tellement évident que j ai presque honte d'avoir pas trouvé tout seul .


    ce changement de valeur de mes listes m amène à la question suivante :

    a la suite d une selection , j execute une fonction qui met a jour une table dépendante de l IND et la BRAND selectionnée . Mais comme la mise a jour du combobox se fait dans un thread, je n ai pas de garantie que au moment ou ma fonction est executée, les valeurs des combo sont déjà changée. Quel est la best Practice pour ce genre de situation .

  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
    Citation Envoyé par somnix Voir le message
    merci merci merci

    ça semble tellement évident que j ai presque honte d'avoir pas trouvé tout seul .
    Ca peut arriver à tout le monde, lorsqu'on a le nez dans le guidon, de ne pas penser aux évidences.

    Citation Envoyé par somnix Voir le message
    ce changement de valeur de mes listes m amène à la question suivante :

    a la suite d une selection , j execute une fonction qui met a jour une table dépendante de l IND et la BRAND selectionnée . Mais comme la mise a jour du combobox se fait dans un thread, je n ai pas de garantie que au moment ou ma fonction est executée, les valeurs des combo sont déjà changée. Quel est la best Practice pour ce genre de situation .
    Salut,

    je ne comprends pas trop pourquoi tu aurais un thread qui met à jour un combo ? Quel combo ? IND ou BRAND ou les deux ? Qu'est ce que tu entends par "met à jour" : remplir le modèle, sélectionner l'index 0 ? Dans les deux cas pourquoi faire ?
    Que tu aies un thread (ou, mieux, un SwingWorker) pour faire la requête qui va chercher les donnée pour ta JTable, je comprendrais, parce que la requête peut être assez longue, et donc éviter de bloquer l'UI, on la ferait hors du thread graphique.
    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 du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    je ne comprends pas trop pourquoi tu aurais un thread qui met à jour un combo ? Quel combo ? IND ou BRAND ou les deux ? Qu'est ce que tu entends par "met à jour" : remplir le modèle, sélectionner l'index 0 ? Dans les deux cas pourquoi faire ?

    désolé, j ai pas bien explique la situation .

    en fait quand je selectionne soit une BRAND , soit une IND, dans une deble en dessous j'affiche soit ... toute les IND by BRAND , soit toute les BRAND by IND.

    donc quand je sélectionne par exemple une ind , je reset la sélection de la BRAND (brands.setSelectedIndex(0) et ensuite je rafraichis ma table.

    peux -etre que j'ai mal lu la documentation , mais je pensais que pour faire par exemple le setSelectedIndex() il fallait utiliser qqch comme ca

    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    lstBrand.setSelectedIndex(0);
    }
    });

    mais si droit derriere j'appele ma fonction qui rafraichis la table, je ne suis pas sur que la liste sera déja mise a jour.


    désolé je suis pas sur d etre tres clair

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    ooops , je crois que je viens de trouver la réponse .

    SwingUtilities.InvokeAndWait()


    mais est ce que c est bien juste de faire ca ? est ce qu il est nécessaire de passer par ca chaque fois qu on met a jour un element de l interface ?

  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
    Salut,

    le changement de sélection, qui provoque un évènement, que tu récupères par un ActionListener, s'éxécute dans le thread AWT-EventQueue.

    Un invokeLater, c'est demander expressément dexécuter une séquence de code dans le thread AWT-EventQueue.

    Donc ce n'est pas la peine de faire un invokeLater, puisque tu es déjà dans le même thread : c'est utile éventuellement lorsqu'on a un risque de boucle évenementielle (le code modifie un autre composant, qui provoque un évenement, qui modifie ton composant, alors qu'il est dans un état "modification en cours" puisque tu es entrain de traiter son évenement de sélection, qui provoque un évenement, etc...), ce qui était le cas avant que tu empêches la propagation de l'événement de sélection. A priori, je pense que ce n'est pas nécessaire dans ton cas.

    Quand bien même, un invokeLater permet de synchroniser ton appel sur le thread swing : quand un code s'éxécute sur ce thread, tous les composants son prêts : donc les sélections sont prêtes.

    Bien sur il ne faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo2.setSelection...
       }
    }
    remplirTable()
    );
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void remplirTable() {
     
    combo1.getSelection...
    combo2.getSelection...
     
    }
    Parce que le setSelection sera mis en file d'attente, donc exécuté après l'évenement courant, et quand tu liras la selection, elle n'aura pas encore changée.

    Il faut se méfier aussi du fait que les 2 combos peuvent lancer le remplissable de ta jtable : il faut donc que tu prennes en compte quand tu traites un évenement de la combo que tu vas changer l'autre combo ou pas et que ça peut déclencher le rafraichissement.

    Par exemple :

    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
    		ind.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( ind.getSelectedIndex()!=0 ) {
    					if ( brand.getSelectedIndex()!=0) {
    						brand.setSelectedIndex(0);
    						// l'évenement va être traitée par l'autre combo
    					}
    					else {
    						rafraichirTable();
    					}
    				}
    				else {
    					rafraichirTable();
    				}
    			}
     
    		});
    		brand.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if ( brand.getSelectedIndex()!=0 ) {
    					if ( ind.getSelectedIndex()!=0) {
    						ind.setSelectedIndex(0);
    						// l'évenement va être traitée par l'autre combo
    					}
    					else {
    						rafraichirTable();
    					}
    				}
    				else {
    					rafraichirTable();
    				}
    			}
     
    		});
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ... rafraichirTable() {
    		... indSel = ind.getSelectedItem();
    		... indBrand = brand.getSelectedItem();
    		... lancer la requête dans un SwingWorker avec indSel et indBrand 
    		et éventuellement interrompre une requête en cours lancée précédemment
    	}

    Un invokeAndWait par contre, en plus de demander l'éxécution dans le thread Swing, demande d'attendre qu'il soit exécuté : on ne peut pas le faire dans le thread swing, parce que ce serait mettre en queue une demande, alors que la queue est en cours de traitement, donc le invokeAndWait devrait attendre que la queue soit traitée avant de mettre ta demande en queue : tu aurais un autoblocage. tu obtiendras d'ailleurs une exception si tu appelles invokeAndWait dans le thread swing.
    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
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Wow , merci pour la réponse. Ça devient les poupées Russes pour moi

    tu me dis : bien sur il ne faut pas faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo2.setSelection...
       }
    }
    remplirTable()
    );

    mais alors quelle est la solution ?

    ça ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo2.setSelection...
          remplirTable();
       }
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilties.invokeAndWait(new Runnable()) {
       public void run() {
          combo2.setSelection...     
       }
    }
    remplirTable();
    ???? je suis un peu perdu ...


    et encore une question :

    si brands.setSelectionIndex(0) déclanche un event qui sera gêré dans l'EDT. faut-il faire quelque chose comme suit ou c'est complètement absurde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          brands.setSelectionIndex(0);
       }
    }
    );

  9. #9
    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
    Citation Envoyé par somnix Voir le message
    Wow , merci pour la réponse. Ça devient les poupées Russes pour moi

    tu me dis : bien sur il ne faut pas faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo2.setSelection...
       }
    }
    remplirTable()
    );

    mais alors quelle est la solution ?
    Bah, ce que j'ai mis après "Par exemple"

    Citation Envoyé par somnix Voir le message
    ça ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo2.setSelection...
          remplirTable();
       }
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SwingUtilties.invokeAndWait(new Runnable()) {
       public void run() {
          combo2.setSelection...     
       }
    }
    remplirTable();
    ???? je suis un peu perdu ...
    Pourquoi vouloir demander l'exécution dans l'EDT alors que le code s'éxecute déjà dans l'EDT ? Le seul cas comme je le disais c'est si ce que tu veux exécuter doit l'être lorsque le code à exécuter peut avoir besoin d'un état que tu es entrain de modifer, ou que le code à exécuter peut provoquer l'évenement dans lequel le code actuel s'exécute (risque de boucle)

    Quant à l'invokeAndWait, tant que tu es dans un event Swing, tu peux l'oublier : tu n'auras jamais à l'utiliser (tu ne pourrais pas de toute manière, puisqu'il causerait une exception).

    Citation Envoyé par somnix Voir le message

    et encore une question :

    si brands.setSelectionIndex(0) déclanche un event qui sera gêré dans l'EDT.


    faut-il faire quelque chose comme suit ou c'est complètement absurde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          brands.setSelectionIndex(0);
       }
    }
    );
    Tout ce que j'ai dit est :
    - on fait ça quand c'est nécessaire et ou c'est nécessaire
    - on ne le fait pas quand ça n'est pas nécessaire

    Donc en résumé :
    - tout evenement Swing s'exécute dans l'EDT
    - tout action Swing (y compris une qui changerait l'état d'un composant, comme par exemple, la sélection dans une combo) devrait être faite dans l'EDT - je dit devrais, parce que sinon tu risques de changer partiellement un état pendant qu'un événement swing est déclenché, donc faire foirer éventuellement le code résultant (qui va par exemple prendre une sélection d'une combo déjà modifiée et une valeur dans une autre combo par encore modifiée, alors que les deux combo doivent être modifiées "en même temps"
    - on évite d'exécuter des actions longues dans l'edt pour éviter de bloquer l'UI
    - un évenement est susceptible de changer l'état d'un composant (le composant source de l'évenment, tout comme un autre) : donc il ne faut pas exécuter du code susceptible de produire un évenement dans un autre composant avant que les états gérés par l'évenement courant soit complètement changé lorsque l'évenement produit utilise ces états (ce qui est le cas de 2 combos liées : la sélection de l'une dépendant de la sélection de l'autre)
    - donc soit tu post tout (tout est fait dans un invokeLater, et pas seulement le changement de ce qui est sélectionné dans l'autre combo), soit tu t'arranges pour que ton code ne provoque pas d'évenements : pas d'évenements produits = pas d'évenements à gérer = pas d'ordre d'évenements à gérer

    En fait, tous ces problèmes de composants interdépendants pourraient être gérés de façon plus simple avec un modèle. Mais c'est vrai que ça plus de boulot à faire de faire un modèle, surtout quand on a que 2 combos.



    Prenons un cas simple :
    - un label qui affiche un Texte t + un nombre a
    - un bouton : qui incrémente le nombre a
    - un champ : qui permet de saisir le Texte t

    A chaque fois que tu tapes dans le champ, tu fait label.setText( this.getText() + a)
    A chaque fois que tu cliques sur le bouton, tu fait a++, label.setText(champ.getText()+a)

    la pas d'interdépendance : pas besoin d'invokeLater

    maintenant, à la place du champs on mets une combo avec des valeurs prédéterminés (toto, titi, tutu)

    et le bouton ne fait plus a++, mais (a==2)?0:a++ et change la sélection dans la combo en fonction de a (donc a==0, toto, a==1, titi, a==2, tutu).

    Si quand tu cliques sur ton bouton, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    a=(a==2)?0:a++;
    SwingUtilties.invokeLater(new Runnable()) {
       public void run() {
          combo.setSelectionIndex(a);
       }
    }
    label.setText(combo.getSelectionItem()+a); 
    );
    lors de l'éxécution de label.setText : la combo n'aura encore changer de sélection...

    Le plus simple est que tu te rajoutes des System.out.println("J'éxécute l'évenement dans ma combo 1..."); et regarde l'ordre d'affichage des messages : comme suit

    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
    public class POCComboLiees { 
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
     
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		frame.getContentPane().add(panel);
    		panel.setLayout(new GridLayout(2,1));
     
    		JComboBox combo1 = new JComboBox(new Object[]{"%","A1","A2","A3"}) {
    			public String toString() {return "combo 1";}
    		};
    		JComboBox combo2 = new JComboBox(new Object[]{"%","B1","B2","B3"}) {
    			public String toString() {return "combo 2";}
    		};
     
    		panel.add(combo1);
    		panel.add(combo2);
     
    		class ComboActionListener implements ActionListener {
     
    			private JComboBox comboMaitre;
    			private JComboBox comboEsclave;
     
    			public ComboActionListener(JComboBox comboMaitre, JComboBox comboEsclave) {
    				this.comboMaitre=comboMaitre;
    				this.comboEsclave=comboEsclave;
    			}
     
    			public void actionPerformed(ActionEvent e) {
    				testSansInvokeLater(e);
    				//testAvecInvokeLater(e);
    			}
     
    			private void testSansInvokeLater(ActionEvent e) { 
    				etatAvant();
    				if( comboMaitre.getSelectedIndex()!=0 ) {
    					System.out.println("dans "+ comboMaitre + " - changement selection de " + comboEsclave);
    					comboEsclave.setSelectedIndex(0);
    					System.out.println("dans "+ comboMaitre + " - selection " + comboEsclave+ " après propagation = " + comboEsclave.getSelectedItem());
    				}
    				else {
    					System.out.println("dans "+ comboMaitre + " - pas de propagation");
    				} 
    			}
     
    			private void etatAvant() {
    				System.out.println("dans "+ comboMaitre + " - action ");
    				System.out.println("dans "+ comboMaitre + " - selection " + comboMaitre + " = " + comboMaitre.getSelectedItem());
    				System.out.println("dans "+ comboMaitre + " - selection " + comboEsclave + " =  " + comboEsclave.getSelectedItem());
    			}
     
    			private void testAvecInvokeLater(ActionEvent e) { 
    				etatAvant();
    				if( comboMaitre.getSelectedIndex()!=0 ) {
    					System.out.println("dans "+ comboMaitre + " - changement selection de " + comboEsclave + " dans invokeLater");
    					SwingUtilities.invokeLater(new Runnable() {
     
    						public void run() {
    							comboEsclave.setSelectedIndex(0);
    						}
    					});
    					System.out.println("dans "+ comboMaitre + " - selection " + comboEsclave+ " après propagation = " + comboEsclave.getSelectedItem());
    				}
    				else {
    					System.out.println("dans "+ comboMaitre + " - pas de propagation");
    				} 
    			} 
     
    		}
     
    		combo1.addActionListener(new ComboActionListener(combo1, combo2));
    		combo2.addActionListener(new ComboActionListener(combo2, combo1));
     
    		frame.setSize(100,100);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    Affichage (je sélection A1, puis B1) :

    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
    dans combo 1 - action 
    dans combo 1 - selection combo 1 = A1
    dans combo 1 - selection combo 2 =  %
    dans combo 1 - changement selection de combo 2
    dans combo 2 - action 
    dans combo 2 - selection combo 2 = %
    dans combo 2 - selection combo 1 =  A1
    dans combo 2 - pas de propagation
    dans combo 1 - selection combo 2 après propagation = %
    dans combo 2 - action 
    dans combo 2 - selection combo 2 = B1
    dans combo 2 - selection combo 1 =  A1
    dans combo 2 - changement selection de combo 1
    dans combo 1 - action 
    dans combo 1 - selection combo 1 = %
    dans combo 1 - selection combo 2 =  B1
    dans combo 1 - pas de propagation
    dans combo 2 - selection combo 1 après propagation = %
    puis avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void actionPerformed(ActionEvent e) {
    				//testSansInvokeLater(e);
    				testAvecInvokeLater(e);
    			}
    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
    dans combo 1 - action 
    dans combo 1 - selection combo 1 = A1
    dans combo 1 - selection combo 2 =  %
    dans combo 1 - changement selection de combo 2 dans invokeLater
    dans combo 1 - selection combo 2 après propagation = %
    dans combo 2 - action 
    dans combo 2 - selection combo 2 = %
    dans combo 2 - selection combo 1 =  A1
    dans combo 2 - pas de propagation
    dans combo 2 - action 
    dans combo 2 - selection combo 2 = B1
    dans combo 2 - selection combo 1 =  A1
    dans combo 2 - changement selection de combo 1 dans invokeLater
    dans combo 2 - selection combo 1 après propagation = A1
    dans combo 1 - action 
    dans combo 1 - selection combo 1 = %
    dans combo 1 - selection combo 2 =  B1
    dans combo 1 - pas de propagation
    maintenant si tu remplaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("dans "+ comboMaitre + " - selection " + comboEsclave+ " après propagation = " + comboEsclave.getSelectedItem());
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    remplirTable( comboMaitre.getSelectedItem(), comboEsclave.getSelectedItem()
    Tu vois que les deux codes ne passeront pas les mêmes valeurs à la méthode remplirTable... (et ceci même si on avait la lecture des getSelectedItem() dans la méthode remplirTable, ça ne changerait rien, on serait dans le même thread)
    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.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Merci Joel , pour cette réponse très complète et très utile.

    J'ai enfin les idées un peu plus claires et je me rend compte que j ai codé bcp de M..... avant ça. A se demander comment ça fonctionnait.

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

Discussions similaires

  1. Spliter deux lignes dépendantes l'une de l'autre
    Par pop_up dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 14/12/2011, 13h29
  2. [AC-2010] Zone de liste dépendante d'une autre
    Par barb63 dans le forum IHM
    Réponses: 2
    Dernier message: 16/10/2011, 23h00
  3. [AC-97] liste dépendant d'une autre dans formulaire continu
    Par 6ril25 dans le forum IHM
    Réponses: 8
    Dernier message: 03/09/2009, 12h26
  4. zone de liste dépendante d'une autre zone de liste
    Par popof60 dans le forum Access
    Réponses: 3
    Dernier message: 30/03/2007, 15h28
  5. Zone de liste dépendant d'une autre liste
    Par JimmyB dans le forum Access
    Réponses: 7
    Dernier message: 31/03/2006, 22h36

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