Retourner valeur depuis addSelectionListener

Fermé
montdorchaud Messages postés 13 Date d'inscription vendredi 8 août 2008 Statut Membre Dernière intervention 21 mai 2010 - 13 août 2008 à 19:47
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 16 août 2008 à 14:18
Bonjour,

je vous fait part de mon problème. Je tente (vainement) de créer depuis quelques jours un petit programme informatique en Java alors que j'y connais pas grand chose (j'ai des bases en fortran et C). Jusqu'à tout à l'heure ça allait plus ou moins, mais dès que j'ai commencé à vouloir créer une interface graphique c'est devenu un peu plus complexe. En l'occurrence, j'ai suivie un certain nombre de tutoriels sur le swt (car j'utilise eclipse) mais je bute toujours sur le problème suivant :

Une partie du programme consiste en un questionnaire à choix multiple. J'ai donc programmé trois boutons radios ("button", "button_1", "button_2") qui correspondent aux 3 réponses possibles et je souhaite faire en sorte que lorsque l'on clique sur la bonne réponse (donc le bon bouton) le compteur de bonnes réponses incrémente de 1.Sauf que voilà, il veut pas que je renvoi une valeur et il n'accepte pas que je fasse appel à une variable définit dans le main.

Pour illustrer un peu mes propos je vous met le cas où lorsqu'on clique sur le bouton "button" le compteur de bonnes réponses "goodres" devrait augmenté de 1 :


int goddres =0;

...

button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {
label_5.setText("Réponse juste!");
goodres++; }
public void widgetDefaultSelected(SelectionEvent arg0) {};
});



Comment ki fo faire?
Merci d'avance pour votre aide.

PS: j'ai une autre question sûrement très naïve et qui n'a rien à voir... est-ce qu'on peut générer (comme pour le langage C) des exécutables à partir du code source, afin que l'on puisse faire tourner son programme sans passer par Eclipse?
A voir également:

4 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 août 2008 à 09:01
Salut,

En fait imaginons que tu aies une classe Main avec la variable goodres dedans. L'idéal serait que tu crées une classe de Listener qui possède une variable de type Main. Et comme ça tu retrouves la référence vers goodres facilement. Il suffit de passer ton objet Main en paramètre du constructeur du Listener. Bien sûr pour ça il faut prévoir un constructeur définit par toi...

Ensuite oui tu peux générer des executables mais là je connais pas trop...
1
montdorchaud Messages postés 13 Date d'inscription vendredi 8 août 2008 Statut Membre Dernière intervention 21 mai 2010 4
14 août 2008 à 10:52
Ok je crois avoir compris le principe, mais dans la pratique les choses me paraissent un peu plus compliquées...

Déjà comment tu fais pour passer l'instruction "button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent arg0) {" dans une classe? Perso j'en ai aucune idée (je tiens à rappeler que je suis débutant).

D'ailleurs, peut-on mettre un objet en argument d'une classe?

Merci pour ta réponse.
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 août 2008 à 11:12
Je vais te faire un petit résumé de ce qui doit se passer :-)

Tu commences par créer ta classe Main:
class Main 
{
    public int goodres = 0;
    //gnagnagna...
}


Tu crées une classe qui implémente un SelectionListener, car ce dernier est une interface et ne peux pas être instancié en tant qu'objet directement.
Et tu ajoutes à ta classe un attribut de type "Main". Tu pourras lui donner cet objet Main par le biais d'un constructeur developpé par tes soins :-)
class MySelectionListener implements SelectionListener
{
    private Main main;

    public MySelectionListener(Main m)
    {
        this.main = m;
    }

    public void widgetSelected(SelectionEvent arg0) 
    {
        label_5.setText("Réponse juste!");
        main.goodres++; 
    }

    public void widgetDefaultSelected(SelectionEvent arg0) {}
}


Et enfin pour ton bouton:
button.addSelectionListener(new MySelectionListener(main));

Bien sûr il faut que main soit un objet de type Main.

Tu vois mieux comment ça se passe?
0
montdorchaud Messages postés 13 Date d'inscription vendredi 8 août 2008 Statut Membre Dernière intervention 21 mai 2010 4
14 août 2008 à 12:29
Woua! J'essaye de comprendre depuis tout à l'heure. J'ai repris les cours de java depuis le début (implement, constructeurs, etc.) mais j'avoue que je suis quand même paumé.

J'ai essayé de créer la classe Main comme tu me l'a dit mais franchement, là, je vois pas. En tout cas, ça me paraît bien compliqué pour un tout petit truc... bon c'est vrai que d'un autre côté c'est bien car ça me permet de travailler efficacement et de mieux comprendre les concepts du langage.

Je crois que j'aurai encore besoin d'un petit coup de pouce. En tout cas merci beaucoup pour ton aide :-)
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 août 2008 à 13:11
L'idéal ce serait que tu prennes un exemple tout fait et bien expliqué.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
14 août 2008 à 13:21
C'est aussi très important que tu comprennes bien les concepts de la programmation orienté objet.
Par exemple la classe Chien hérite de Mammifère qui hérite de Animal.

Chien est une classe mais pas un objet. Un objet est une instance d'une classe. Par exemple Malbrouk de 30 millions d'amis est une instance de Chien. Igor le vieux caniche horripilant de ma voisine est une instance de Chien.
On dit dans ce cas là que Igor est un Chien mais aussi un Mammifère et aussi un Animal.

Tu as le droit de faire
Animal igor = new Chien()


Une classe c'est juste le concept qui définit un objet. Une classe Maison c'est les plans d'une maison. Une instance de Maison c'est un objet maison qui peux avoir au choix des rideaux violets etc...

Une interface c'est une classe qui ne possède que des méthodes non implémentées. Celui qui dit qu'il implémente une interface doit implémenter ses méthodes.
Exemple avec l'interface "Volant".
Tu peux créer la classe SourisMarsupiale qui hérite de Mammifère et qui implémente Volant
Dans volant tu as la méthode voler(), alors SourisMarsupiale devra implémenter la méthode voler() à sa façon. Parce ChauveSouris implémentera la méthode voler() d'une toute autre manière (car les souris marsupiales planent un peu, alors que les chauves-souris volent avec leurs ailes).

C'est très important que tu maîtrises toutes ces choses avant de commencer. Sans compter les fondements de l'orienté objet.
0
montdorchaud Messages postés 13 Date d'inscription vendredi 8 août 2008 Statut Membre Dernière intervention 21 mai 2010 4
15 août 2008 à 01:09
Bon, je suis à deux doigts de tout laisser tomber tant je me prend la tête depuis 2 jours...
J'ai plus ou moins réussit à faire ce que tu m'as dit kilian, mais ça bug à fond car je pense que je ne connais pas encore assez bien Java et que j'ai écris mon codes comme un porc.

Mon nouveau problème c'est qu'étant donné que je souhaite faire un quizz, je veux qu'il y ait une boucle sur mes évenements... et c'est là que le bas blesse car je sais pas comment lui demander d'attendre le temps qu'il y ait un click sur l'un des boutons avant de reprendre l'incrementation du i dans la boucle while. Du coup j'ai éssayé de m'en sortir en bidouillant plus ou moins mais je crois que j'ai trop foutu le bordel.

Help!

Voilà mon bout de code :

int n, n2, cas, cas2, i=1, j=1, Knowlist, Numéroligne, rep=0;
			  		float Meilleurscore;
			  		String mots;
			  		
			  		String[] motab=new String[2];
			  		String[] fake1=new String[2];
			  		String[] fake2=new String[2];
			  		
			  		n=cFichiers.nblign("Listesp.txt",0);
			  		n2=cFichiers.seeklign("infile.txt",1);
			    	
			  		while (i<=20)
			  		{
			  		

                                                // Le "if" suivant permet d'attendre un nouveau click des boutons avant de lancer les randoms
			  			if (i==j)
			  			{
			  				label_2.setText("Réponses : "+rep+"/"+i);
							
							Numéroligne=random.go(n);
					    	label_1.setText("Mot n°"+Numéroligne);
					    	mots=cFichiers.seekligntxt("Listesp.txt", Numéroligne);
					    	motab=mots.split("\\t");

					    	mots=cFichiers.seekligntxt("Listesp.txt", random.go(n));
					    	fake1=mots.split("\\t");
					    	
					    	mots=cFichiers.seekligntxt("Listesp.txt", random.go(n));
					    	fake2=mots.split("\\t");
					    	
					    	j++;
			  			}
					    	
									cas2=random.go(3);
									switch (cas2)
									{
										case 1:
											button.setText(motab[1]);
											button_1.setText(fake1[1]);
											button_2.setText(fake2[1]);
											
											button.addSelectionListener(new SelectionListener() {
											    public void widgetSelected(SelectionEvent arg0) {
											    	cMain goodres=new cMain(0,0);
											    	label_5.setText("Juste!");
											    	goodres.inc();
											    }
											    public void widgetDefaultSelected(SelectionEvent arg0) {
											    };
											    });
											
											button_1.addSelectionListener(new SelectionListener() {
											    public void widgetSelected(SelectionEvent arg0) {
											    cMain goodres=new cMain(0,1);
											    label_5.setText("Faux!");
											    }
											    public void widgetDefaultSelected(SelectionEvent arg0) {
											    }
											    });
											
											button_2.addSelectionListener(new SelectionListener() {
											    public void widgetSelected(SelectionEvent arg0) {
											    cMain goodres=new cMain(0,1);
											    label_5.setText("Faux!");
											    }
											    public void widgetDefaultSelected(SelectionEvent arg0) {
											    }
											    });
											
											rep=rep+cMain.rep();
                                                                                        // permet de récupérer la valeur de goodres (1 si reponse juste, 0 si reponse fausse)
											i=i+cMain.ind();
                                                                                        // permet d'incrémenter i à partir des boutons 
											System.out.println("j="+j);
											
											
											break;
										
										case 2: 
                                                                                          // (idem)

											
										case 3: 
                                                                                          // (idem)
									
									
							}
						    
							if (i==20)
							{
								Display display = new Display();
								Shell shell = new Shell(display);
								shell.setLayout(new FillLayout());
								shell.setSize(400, 200);
								shell.setText("Résultats");
								
							}
						    
			      }
			      }
			      public void widgetDefaultSelected(SelectionEvent arg0) {
			      }
			    });




S'il vous plait aider moi. J'aimerai pouvoir pondre un code relativement propre et qui FONCTIONNE!!!
Merci d'avance
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
16 août 2008 à 14:18
Je n'ai pas l'habitude d'utiliser cete api. J'ai plus l'habitude de swing avec les JPanel.
Sincèrement cherche d'abord à faire un petit truc tout simple pour commencer, prends des exemples sur le web. C'est normal que tu en baves, si tu commences avec Java, les interfaces graphiques c'est pas ce qu'il y a de plus facile.
0