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

Langage Java Discussion :

Informer un Listener à partir d'un autre Listener


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut Informer un Listener à partir d'un autre Listener
    Bonjour,

    Je me retourne vers vous encore une fois avec un nouveau souci:

    Je voudrais informer un listener qu'une variable à l'interieur d'un autre listener a changé (incrémentée) pour que le premier Listener en prend compte.

    Je m'explique:

    Je travaille sur un QCM et j'ai une GUI (EcranQcmPourMembAdmin )avec des boutons radios (choix de réponses) et des boutons "suivant" et "précedent" pour naviguer entre les exercices.

    Les boutons radios sont écoutés par un Listener sous forme d'une classe interne (BoutonRadioListener) et les boutons de naviguation sont écoutés par une autre classe externe (EcranQcmPourMembAdminListener).

    Dans de la classe GUI, j'ai créé des variables "premierCoup" "secondCoup" et "nonTrouve" qui est s'incrémente à l'intérieur du Listener (BoutonRadioListener) à chaque fois que l'utilisateur trouve la bonne réponse au premier coup, ou au second coup...Je voudrais à la fin du QCM afficher les résultats de l'utilisateur (méthode afficherResultatQcm()).

    Dans l'état actuel, bien que je parcoure tout les 10 exercices du QCM les résulats ne s'affiche pas comme il faut, exp:

    Bonne(s) réponse(s) au premier essai: 1
    Bonne(s) réponse(s) au second esai: 0
    Question(s)non trouvé(es): 0

    L'incrémentation de la variable "premierCoup" se fait uniquement à l'intérieur du listener (BoutonRadioListener). Comment informer l'autre Listener que la variable a changé?

    Merci pour votre aide.

    Voici les morceaux de code concernés:

    la classe EcranQcmPourMembAdmin:

    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
     
    ....
    //declaration de variables.....entre autres...
     
            public JRadioButton reponse1 = null;
    	public JRadioButton reponse2 = null;
    	public JRadioButton reponse3 = null;
    ...
            private int premierCoup=0;
    	private int secondCoup=0;
    	private int nonTrouve=0;
     ....        
           private JButton suivant = null;
           private JButton prcedent = null;
     
    //instanciation de deux listeners
     
    EcranQcmPourMembAdminListener ecranQcmMembAdminListener = new EcranQcmPourMembAdminListener(this, qcm, compteur, niv,chapi,diffi, user, premierCoup , secondCoup , nonTrouve ); 
     
    	BoutonRadioListener boutonRadioListener = new BoutonRadioListener();
     
    ....
     
    //mise des boutons radios sous écouteur
     
    reponse1.addActionListener(boutonRadioListener);
    reponse2.addActionListener(boutonRadioListener); 
    reponse3.addActionListener(boutonRadioListener);
     
    ....
     
    //mise des boutons de navigation sous ecouteur
     
    suivant.addActionListener(ecranQcmMembAdminListener);
    prcedent.addActionListener(ecranQcmMembAdminListener);	
     
    //la methode ActionPerformed du listener interne BoutonRadioListener
     
    	public void actionPerformed(ActionEvent e) {
     
     
    		// TODO Raccord de méthode auto-généré
     
    		//si la reponse est bonne du premier coup
            	if(nombReponFausse[compteur]==0 && exerc.reponseValide(getIndex((JRadioButton)e.getSource()))){
     
     
            		//on affiche un message accompagné d'un son
    				afficherMessageEtJouerEffet("Bonne réponse",new Color(0,255,0),"happy","happy");
     
    				//on compte les reponses au premier coup
    				premierCoup++;
     
     
    				//si on est à la fin du qcm on affiche les resultats
    				if(compteur==9)
    				afficherResultatQcm();
     
    				//on desactive les deux autres boutons
    				desactiverleOuLesBoutonRestant(getIndex((JRadioButton)e.getSource()));			
            	}
            	//si la reponse est fausse du premier coup
    			else if(nombReponFausse[compteur]==0 && !exerc.reponseValide(getIndex((JRadioButton)e.getSource()))){
     
     
    				//on compte les fausse reponses
    				nombReponFausse[compteur]++;
    				//on affiche un nouveau message assorti d'un son
    				afficherMessageEtJouerEffet("Mauvaise réponse..! Il faut recommencer",new Color(255,0,0),"sad","sad");
     
    				//on desactive le bouton on question
    				getRadioBouton(getIndex((JRadioButton)e.getSource())).setEnabled(false);
    				}
            	//si la réponse est bonne au deuxième coup
    			else if (nombReponFausse[compteur]==1 && exerc.reponseValide(getIndex((JRadioButton)e.getSource()))){
     
    				nonResolu[compteur]=false;
    				//on affiche un message accompagné d'un son
    				afficherMessageEtJouerEffet("Bonne réponse",new Color(0,255,0),"happy","happy");
     
    				//on desactive le bouton restant
    				desactiverleOuLesBoutonRestant(getIndex((JRadioButton)e.getSource()));	
     
    				//on compte les bonnes reponses au second coup
    				secondCoup++;
     
    				//si on est à la fin du qcm on affiche les resultats
    				if(compteur==9)
    				afficherResultatQcm();
    			}
     
            	//si la réponse est fausse pour la deuxième fois
    			else if (nombReponFausse[compteur]==1 && !exerc.reponseValide(getIndex((JRadioButton)e.getSource()))){
     
    				//on affiche un nouveau message assorti d'un son
    				afficherMessageEtJouerEffet("Et alors ..! tu ne vois pas la bonne réponse ?",new Color(255,0,0),"nervous","nervous");
     
    				//on compte les reponses non trouvés
    				nonTrouve++;
     
    				//on desactive le bouton concerné
    				getRadioBouton(getIndex((JRadioButton)e.getSource())).setEnabled(false);
    				//si on est à la fin du qcm on affiche les resultats
    				if(compteur==9)
    				afficherResultatQcm();
    			}
     
    	}
    //la methode qui affiche les résultat
     
    private void afficherResultatQcm() {
    		// TODO Raccord de méthode auto-généré
     
    		//on affiche les resultats dans une boite de dialogue
     
    		String message=null;
    		message="Bonne(s) réponse(s) au premier essai: "+premierCoup+ "\n";
    		message+="Bonne(s) réponse(s) au second esai :"+secondCoup+ "\n";
    		message+="Question(s)non trouvé(es): "+nonTrouve;
    		JOptionPane.showMessageDialog(null, message , "Résultats", JOptionPane.INFORMATION_MESSAGE);
     
    	}
    La classe EcranQcmPourMembAdminListener

    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 EcranQcmPourMembAdminListener implements ActionListener{
     
    	private EcranQcmPourMembAdmin ecranQcmMembAdmin = null;
    	private ArrayList qcm;
    	private Utilisateur utilisateur = null;
    	private int compteur=0;
    	private String niveau=null;
    	private String chapitre= null;
    	private String difficulte= null;
    	private boolean[] nonResolu;  
    	private boolean[] fait; 
    	private int premierCoup=0;
    	private int secondCoup=0;
    	private int nonTrouve=0;
    	private int[] fat;
     
    	public int getPremierCoup() {
    		return premierCoup;
    	}
     
    	public void setPremierCoup(int premierCoup) {
    		this.premierCoup = premierCoup;
    	}
     
    	//premier constructeur avec paramètres
    	public EcranQcmPourMembAdminListener(EcranQcmPourMembAdmin eQPMA, ArrayList qcm, int compteur, String niveau, String chapitre, String difficulte, Utilisateur utilisateur){
    		super();
    		this.compteur= compteur;
    		this.qcm= qcm;
    		this.ecranQcmMembAdmin=eQPMA;
    		this.chapitre= chapitre;
    		this.niveau=niveau;
    		this.difficulte=difficulte;
    		this.utilisateur=utilisateur;
     
    	}
     
    	//second constructeur avec parametres qui permet de récuperer les variables compteurs et boolean
     
    	public EcranQcmPourMembAdminListener(EcranQcmPourMembAdmin eQPMA, ArrayList qcm, int compteur, String niveau, String chapitre, String difficulte, Utilisateur utilisateur, int premierCoup, int secondCoup, int nonTrouve){
    		super();
    		this.compteur= compteur;
    		this.qcm= qcm;
    		this.ecranQcmMembAdmin=eQPMA;
    		this.chapitre= chapitre;
    		this.niveau=niveau;
    		this.difficulte=difficulte;
    		this.utilisateur=utilisateur;
    		this.nonResolu=nonResolu;
    		this.premierCoup=premierCoup;
    		this.secondCoup=secondCoup;
    		this.nonTrouve=nonTrouve;
     
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		// TODO Raccord de méthode auto-généré
    		String acte=e.getActionCommand();
     
    		if(acte=="Suivant"){
     
    			//si l'exercice n'est pas achevé on affiche un message dans une boite 
    			if (nonResolu[compteur])
    				JOptionPane.showMessageDialog(null, "Tu n'as pas fini l'exercice courant!" , "Message", JOptionPane.INFORMATION_MESSAGE);
    			 else{
    			ecranQcmMembAdmin.dispose();
    			Exercice exo = (Exercice) qcm.get(compteur+1);
    			EcranQcmPourMembAdmin ecranQcmMembAdmin = new EcranQcmPourMembAdmin(qcm, compteur+1,utilisateur,exo,niveau,chapitre, difficulte);
    			ecranQcmMembAdmin.setVisible(true);
    			 }
     
    		}
    		else if (acte=="Précedent"){
     
    			ecranQcmMembAdmin.dispose();
    			Exercice exo = (Exercice) qcm.get(compteur-1);
    			EcranQcmPourMembAdmin ecranQcmMembAdmin = new EcranQcmPourMembAdmin(qcm, compteur-1,utilisateur,exo,niveau,chapitre, difficulte);
     
    			ecranQcmMembAdmin.setVisible(true);
     
    		}
     
    	}
     
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Sans lire ton code plus que cela, je ferais :

    une classe stockant ta valeur à incrémenter, avec méthodes set et get.
    une classe par listener (extends ActionListener ou autre).

    La méthode de la première classe appelle la valeur avec le get, l'incrémente et la renvoie avec le set, puis instancie un appel de la classe du second listener. Cette dernière reçoit la valeur incrémentée avec le get...

    Encore une fois, je n'ai pas analysé ton problème en profondeur.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    Citation Envoyé par HNoury Voir le message
    Sans lire ton code plus que cela, je ferais :

    une classe stockant ta valeur à incrémenter, avec méthodes set et get.
    une classe par listener (extends ActionListener ou autre).

    .....
    Encore une fois, je n'ai pas analysé ton problème en profondeur.
    Je crains de ne pas bien saisir. Une classe rien que pour stocker une variable qui s'incremente selon les cas!

    D'ailleurs je me rappelle avoir tenté des trucs avec les get et set mais en vain: j'ai crée les gets de la variable "premierCoup" dans le deuxième listener pour pouvoir l'atteindre à partir du premier....

    E tout cas je vais reessayer...

    Je sais... c'est pas facile de suivre le code de quelqu'un d'autre...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    N'oublie pas de rappeler l'instance de cette classe valeur en début de constructeur des classes listener :

    class EcouteTralala {
    public EcouteTralala (Valeur instanceValeur){
    this.instanceValeur = instanceValeur;}

    public void LaMethode {//Ce que tu veux}

    private Valeur instanceValeur;
    }

    Chez moi, le main lance une classe qui instancie tout le reste et leur permet de communiquer. Elle héberge aussi le menu et les premiers boutons.

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    Citation Envoyé par HNoury Voir le message
    N'oublie pas de rappeler l'instance de cette classe valeur en début de constructeur des classes listener :

    class EcouteTralala {
    public EcouteTralala (Valeur instanceValeur){
    this.instanceValeur = instanceValeur;}

    public void LaMethode {//Ce que tu veux}

    private Valeur instanceValeur;
    }

    Chez moi, le main lance une classe qui instancie tout le reste et leur permet de communiquer. Elle héberge aussi le menu et les premiers boutons.
    En effet, à quelques choses près de ce genre j'ai pu résoudre le problème.
    J'ai crée un nouveau constructeur dans ma première classe qui me permet de récupérer ma variable. Et je l'incremente avec un setter dans le second listener...

    Merci pour le tuyau...

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

Discussions similaires

  1. [2012] Linked Server sur Listener à partir des réplicas
    Par Baquardie dans le forum Administration
    Réponses: 1
    Dernier message: 04/11/2014, 15h59
  2. Réponses: 4
    Dernier message: 25/07/2011, 15h33
  3. Réponses: 2
    Dernier message: 12/06/2008, 10h48
  4. Récuperer des information d'un jframe à partir d'un autre Jframe
    Par harris_macken dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 25/03/2008, 23h29
  5. [MySQL] Mise à jour constante d'informations à partir d'un autre site
    Par mrsoyer dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 13/02/2008, 10h31

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