Forum des exercices du projet Zuul

Exercice 7.18.8

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.18.8
par anonfirstname2 anonlastname2, jeudi 11 avril 2019, 01:29
 

Ajouter au moins un bouton qui déclenche une des commandes du jeu.
Attention ! Les commandes doivent toujours pouvoir être tapées dans la ligne de saisie.

Vous pouvez vous aider des liens présents dans la rubrique Plus de technique.

Aide pour comprendre l'ajout d'un bouton

  1. Observez les classes utilisées dans UserInterface pour créer divers composants : JTextField, JTextArea, JLabelJScrollPane, JPanel, JFrame, ... Il ne doit pas être bien difficile de trouver sur internet quelle classe peut servir pour créer un bouton.

  2. Si vous voulez qu'un texte précis apparaisse sur ce bouton, il faut probablement le préciser à la création de l'objet.

  3. Si vous observez où sont placés les 3 composants existants (image, listScroller, entryField), vous constaterez qu'il ne reste que 2 places libres pour votre bouton ; choisissez-en une ! (on ne veut pas positionner les boutons au pixel près, les 5 positions prédéfinies suffisent)
    Compilez, testez pour voir si le bouton apparaît bien où vous le souhaitiez.
    Cliquez dessus ; il ne se passe rien ? C'est normal, voir pour cela les 2 points suivants.


  4. Dans la partie // add some event listeners to some components
    on ne s'intéresse qu'à l'entryField, pour savoir quand on a tapé ENTRÉE à la fin de la ligne.
    Il faut donc maintenant de la même façon ajouter un "écouteur d'action" sur notre bouton.
    Le paramètre this signifie ici que c'est l'objet courant qui réagira à l'évènement (touche ENTRÉE ou clic sur le bouton).

  5.  Pour l'instant, la méthode actionPerformed (automatiquement appelée en cas d'évènement sur un des composants bénéficiant d'un "écouteur d'action") appelle systématiquement processCommand qui traite la ligne de commande tapée par le joueur (dans l'entryField). Il nous faut donc auparavant tester si l'évènement ne serait pas plutôt un clic sur le bouton, et dans ce cas, déclencher l'action correspondante. Pour cela, 2 possibilités :
    • utilisez la fonction getActionCommand qui retourne la String correspondant au texte figurant sur le bouton (si on a cliqué sur un bouton)
    • utilisez la fonction getSource qui retourne la référence vers le composant qui a généré l'évènement
    Ces 2 fonctions s'appliquent à un ActionEvent, ce qui tombe bien puisque c'est ce dont on dispose dans la procédure actionPerformed.
    Ne pas oublier que s'il y a un évènement alors qu'on n'a pas cliqué sur un bouton, c'est qu'on a tapé quelque chose dans l'entryField !

Vous pouvez aussi lire les explications sur ActionListener et les classes anonymes

Avatar Victor OU
Re: Exercice 7.18.8
par Victor OU, vendredi 11 octobre 2013, 23:27
 

Lorsque vous dites que le bouton doit déclencher la commande, cela veut-il dire que la commande doit-être exécutée ou bien être inscrite dans le parser?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, dimanche 13 octobre 2013, 17:43
 

Il faut demander au GameEngine d'exécuter directement la commande "xxx" correspondant à ce qui est indiqué sur le bouton (remplace le fait de taper "xxx" dans la zone de saisie de texte).

Avatar Hassan DIAB
Re: Exercice 7.18.8
par Hassan DIAB, dimanche 13 octobre 2013, 20:15
 

Je ne vois pas comment je peux faire car la classe GameEngine ne possède qu'une méthode qui a une String en paramètre et celle ci ne peux pas être utilisé ...

Je suis bloqué ici :

if(e.getSource() == bouton)
{
this.engine.Uneclasse("go bas");
}

Je ne sais pas quoi mettre a la place de Uneclasse pour que  bouton execute directement la string " go bas".

Merci d'avance

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, dimanche 13 octobre 2013, 22:52
 

Je ne comprends pas bien votre message :

Si GameEngine possède une méthode void m(String p) qui permet d'exécuter une commande, pourquoi ne pas écrire this.aEngine.m("go bas"); ?

Avatar Hassan DIAB
Re: Exercice 7.18.8
par Hassan DIAB, jeudi 12 mars 2015, 10:53
 

Car la seule méthode avec une string en paramètre qui se trouve dans la classe GameEngine est celle ci :

public void interpretCommand(String Commandline)
{

    code supprimé pour ne pas influencer les futurs lecteurs

}


Je ne vois pas comment je peux provoquer le changement de salle avec cette methode.

(Modifié par Denis BUREAU. Écrit initialement le dimanche 13 octobre 2013, 23:02)

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 14 octobre 2013, 07:57
 

Si la méthode est : interpretCommand(String Commandline)

c'est qu'elle est capable d'interpréter (exécuter) la commande passée en paramètre (commandLine = ligne de commande) !

Il suffit de regarder ses instructions pour y trouver :

if(CommandWord.equals("go"))
{
goRoom(vCommand);
}

Pourquoi cela ne provoquerait-il pas le changement de salle ?

P.S.: votre méthode n'est pas bien programmée puisqu'on y trouve une suite de if non indépendants sans else :
si vous savez que la commande est "xxx" (et que vous l'avez exécutée), à quoi cela sert-il de vérifier ensuite si elle est "yyy" ? Ce n'est que si elle n'est pas "xxx" qu'il faut vérifier si elle est "yyy" !

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 16 avril 2014, 23:23
 

Un étudiant a écrit :

bonjour monsieur,
 
je rencontre une difficulté pour créer un bouton dans mon jeu.
 
pourriez vous m’indiquer comment faire svp.
Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 16 avril 2014, 23:24
 

dites-moi ce que vous avez essayé de faire et quelle est votre difficulté, et je pourrai vous aider ...

Avatar Pierre ADAM
Re: Exercice 7.18.8
par Pierre ADAM, jeudi 17 avril 2014, 09:21
 

Je ne sais pas créer un bouton.

et je ne vois pas du tout comment faire en réalité.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 17 avril 2014, 15:11
 

Voir l'aide ajoutée à l'énoncé de cet exercice.

Si vous êtes bloqué, dites précisément auquel des 5 points vous en êtes arrivé ou bien ce que vous ne comprenez pas dans l'explication.

Avatar Pierre ADAM
Re: Exercice 7.18.8
par Pierre ADAM, samedi 19 avril 2014, 18:09
 

je suis bloqué au point 2

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, samedi 19 avril 2014, 19:00
 
  • Pour créer un objet d'une certaine classe, que faut-il écrire ?
  • Pour savoir quel(s) paramètre(s) il faut passer, on doit consulter la javadoc du constructeur de cette classe. Vous trouverez facilement ce que vous cherchez parmi ceux qui sont proposés.
Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 17 avril 2014, 10:27
 

Un étudiant a écrit :

Bonjour,

J'ai un nouveau warning dans ma classe UserInterface :

 enable(boolean) in java.awt.Component has been deprecated

Je ne trouve pas ce qu'il signifie, que faire ??

Merci d'avance !

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 17 avril 2014, 10:31
 

deprecated veut dire obsolète

java.awt.Component veut dire classe Component du paquetage java.awt

Il suffit donc de lire la javadoc de la méthode enable dans cette classe Component pour savoir par quoi elle doit être remplacée.

Avatar William AFONSO
Re: Exercice 7.18.8
par William AFONSO, dimanche 20 avril 2014, 18:10
 

On crée le bouton dans la classe interface ou bien on doit créer une nouvelle classe spécifique?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 21 avril 2014, 13:35
 

Où sont placés les 3 composants graphiques existants (image, listScroller, entryField) ?

Le bouton est juste un composant graphique supplémentaire.

Avatar William AFONSO
Re: Exercice 7.18.8
par William AFONSO, mardi 22 avril 2014, 10:03
 

Je n'arrive pas à trouver ce qu'il faut tester pour pouvoir savoir si on a cliqué sur un bouton ou si on a entré une chaîne de caractère dans l'entryField. Pouvez-vous m'aider? voici mon code

 

public void actionPerformed(ActionEvent e)
    {   if ( e = aentryField )
        aengine.interpretCommand(e.getActionCommand());
      else if (e != aentryField )
      { processCommand();}

}

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mardi 22 avril 2014, 12:43
 

La logique serait plutôt :

SI on a cliqué sur le boutonA
ALORS exécuter la commande1
SINON SI on a cliqué sur le boutonB
              ALORS exécuter la commande2
              SINON exécuter la commande tapée dans l'entryfield

Et pour savoir si on a cliqué sur un bouton, vous pouvez choisir un des deux moyens indiqués au point 5.

Avatar William AFONSO
Re: Exercice 7.18.8
par William AFONSO, mardi 22 avril 2014, 14:46
 

Et ne peut-on pas faire: Si on a cliqué sur un bouton (nimporte lequel) alors exécuter la commande associée au texte écrit sur ce bouton....

Si oui, c'est ce qui est écrit en rouge que je ne parviens pas à écrire

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mardi 22 avril 2014, 23:11
 

C'est effectivement peu naturel d'écrire ce qui est en rouge (mais c'est quand-même possible : SI la classe du composant qui a déclenché l'évènement est JButton ALORS ...).

Vous pourriez par contre écrire :

SI l'évènement provient de l'entryFieldALORS exécuter la commande tapée dans l'entryField
SINON exécuter la commande correspondant au texte sur le bouton cliqué

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 23 avril 2014, 20:02
 

L'étudiant a répondu :

Je n'arrive toujours pas à écrire " SI la classe du composant qui a déclenché l'évènement est JButton ALORS ...)." : doit-on faire if (e.getClass() == JButton) ? ou même créer une variable de type JButton et faire if(e.getClass() ==  bouton.getClasse() ?
 
Dans les deux cas, il semble que le problème soit que l'on compare un évènement à un bouton. Je ne vois pas par quoi remplacer e.getClass().

En fait, comment récupérer ce dont provient l'évènement ?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 23 avril 2014, 20:08
 

Vous avez bien compris que e.getClass() renvoyait la classe de l'évènement (ActionEvent).
Au passage, je vous signale que vous disposez déjà d'au moins une variable JButton vous permettant d'écrire monBouton.getClass() si vous avez appelé monBouton le bouton que vous avez créé.

Pour répondre à votre dernière question, il vous suffit de relire attentivement le point 5 de l'énoncé, notamment la 2ème solution présentée.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 7 mai 2014, 17:55
 

Un étudiant a écrit :

Je n'arrive pas à trouver mon erreur, pouvez vous me venir en aide s'il vous plait ?
Merci d'avance

 

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, mercredi 7 mai 2014, 18:09
 

Le sage a dit : "Si l'homme pauvre a faim, ne lui donne pas un poisson, apprends-lui à pêcher."

Donc, plutôt que de vous donner la solution, je préfère vous apprendre à la trouver par vous-même :

  1. prendre les éléments dans le message d'erreur :
    il s'agit de la méthode enable (avec un paramètre boolean) dans la classe Component (du paquetage java.awt)
  2. chercher cette méthode dans la javadoc de cette classe
    (taper  java 7 component  dans google, puis chercher  enable  dans la page)
  3. il est bien indiqué que la méthode enable est deprecated (obsolète)et il est précisé la méthode qu'on doit utiliser à la place (chercher cette méthode dans la page)
  4. effectuer la modification dans son code, compiler, tester
Avatar Jonathan MORELL
Re: Exercice 7.18.8
par Jonathan MORELL, dimanche 11 mai 2014, 23:08
 

Bonjour,

Suite à de nombreuses modifications, je me suis rendu compte que j'ai des actions qui était réalisé deux fois. Etant surpris j'ai fais une debug et je me suis appercu que l'événement d'appuie sur un bouton était doublon. L'appui d'une seule fois sur le bouton est détecté deux fois par mon jeu.
Je ne comprends pas d'où vient le problème.

Nous avons éssayé de comprendre d'où venait le problème la semaine dernière avec monsieur Kachouri mais ce fu sans réussite. Avez-vous déjà croisé ce type de problème et savez vous le résoudre ?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 12 mai 2014, 00:04
 

Si tous les boutons utilisent la même méthode actionPerformed, envoyez-moi le code de cette méthode.

Avatar Jonathan MORELL
Re: Exercice 7.18.8
par Jonathan MORELL, jeudi 12 mars 2015, 10:51
 

public void actionPerformed(ActionEvent pE)
    {

         code supprimé pour ne pas influencer les futurs lecteurs

    }

Je peux vous envoyer mon fichier de jeu .jar si vous le voulez.

(Modifié par Denis BUREAU. Écrit initialement le lundi 12 mai 2014, 23:18)

Avatar Jonathan MORELL
Re: Exercice 7.18.8
par Jonathan MORELL, mardi 13 mai 2014, 20:30
 

Après en avoir parlé avec vous cette après-midi, j'avais finalement fait deux "this.aButtons[vI].addActionListener(this);" au lieu d'un, ce qui explique le problème.

Avatar Aurelien LEVY
Re: Exercice 7.18.8
par Aurelien LEVY, jeudi 2 octobre 2014, 23:23
 

Bonjour,

Dans l' Exercice 7.18.6, vous écrivez que " Le Parser a changé et n'a plus besoin de Scanner", et vous écrivez ici que " Les commandes doivent toujours pouvoir être tapées dans la ligne de saisie."
Mais si le Parser n'utilise plus le scanner pour lire ce qu'on écrit, et si on applique les nombreux changements que l'on trouve dans "zuul_with_images" on n'a plus accès au commandes par clavier.

Merci de m'éclairer si je n'ai pas compris quelque chose.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, vendredi 3 octobre 2014, 09:29
 

A partir de la version zuul-with-images, les commandes ne sont plus lues au clavier dans le Parser par un Scanner(System.in) mais dans la UserInterface par un JTextField (dont la String ainsi récupérée est envoyée au Parser pour analyse).

De façon générale, quand on vous donne une nouvelle version du jeu, celle-ci ne remplace pas votre propre jeu ; elle vous permet de voir comment est implémenté telle ou telle fonctionnalité. Vous devez donc modifier votre jeu pour incorporer cette nouvelle fonctionnalité, mais en faisant bien attention de ne pas "régresser", c'est-à-dire remettre en cause des acquis (avantages) des exercices précédents.

Avatar Aurelien LEVY
Re: Exercice 7.18.8
par Aurelien LEVY, jeudi 9 octobre 2014, 17:17
 

Bonjour, J'ai deux questions concernant les boutons.

Après avoir créé mes boutons, j'ai testé mon jeu. Lorsque je clique sur le bouton "Quit", certes, je ne peux plus rien écrire pour donner les instructions, mais tous les boutons continuent de fonctionner... je peux donc continuer de jouer en utilisant seulement les boutons, mais ne peux plus rien écrire...
Je pense bien qu'il faudrait désactiver les ActionListener une fois que le joueur à cliqué sur le bouton "quit", mais je ne vois pas vraiment comment.

Deuxième question, Dans certaines pièces, j'aimerai désactiver certains bouton (par exemple dans la pièce "Salle de Bain", le bouton "Eat" n'est pas vraiment indispensable.) Y a t-il un moyen de le faire à notre niveau ?


Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 9 octobre 2014, 18:39
 

Je pense que cette méthode répond à vos deux questions :

http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#setEnabled%28boolean%29

Avatar Baptiste CHAMBON
Re: Exercice 7.18.8
par Baptiste CHAMBON, mercredi 11 mars 2015, 11:34
 
Bonjour monsieur,
Je rencontre des difficultés pour créer un bouton dans mon jeu.

Dans UserInterface, j'ai initialisé le bouton.

private JButton buttonlook ;

Puis dans createGUI() j'ai par exemple fait

Buttonlook =new JButton ("look") ;

J'ai aussi créé un JPanel pour y ajouter plusieurs boutons et j'ai ajoutésetPreferredSize() pour la taille, ça compile mais aucune trace du bouton.


Avatar Yi Heng CAO
Re: Exercice 7.18.8
par Yi Heng CAO, jeudi 12 mars 2015, 09:35
 

Bonjour,

Je suis actuellement bloqué au même problème...

Par rapport à l'aide que vous nous fournissez:

1. Je pense avoir bien compris qu'il fallait bien placer le Jbutton dans la procédure createGUI() mais je ne vois pas comment le faire apparaître sur l'écran.

2. Je pense aussi avoir compris qu'écrire, par exemple , new JButton("North") permet d'afficher "North" sur le bouton. De plus, avec les liens que vous nous donnez, on peut ajouter une image au bouton si on rajoute une variable, dans laquelle est stockée une image.
Donc voici ce que je comprends en résumé pour JButton() :
          JButton("Nom_du_bouton" , image)

3. Concernant les 3 emplacements des composants, par rapport à l'affiche de zuul-with-image voici ce que j'ai compris:
      image : Partie du haut avec l'image ;
      listScroller : Partie du milieu avec le texte du jeu ;
      entryField : Partie du bas avec l'invite de commande de l'utilisateur ;
Je pense qu'il faut mettre les boutons soit au niveau de l'image, soit de l'invite de commande.
Mais malgré cela, je ne vois pas comment le faire "apparaître" dans l'une des ces emplacements...

(Pour les points 4 à 6, je n'ai pas encore cherché à comprendre vu que je suis bloqué avec l'affichage du bouton)



Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 12 mars 2015, 10:57
 

Votre problème se situe effectivement au 3) : regardez les paramètres de l'appel de la méthode add pour les 3 composants graphiques existants, déduisez-en les 2 possibilités restantes autour du centre, et utilisez l'une d'elles pour placer votre bouton.


Avatar Yi Heng CAO
Re: Exercice 7.18.8
par Yi Heng CAO, jeudi 12 mars 2015, 13:43
 

Merci beaucoup, j'ai bien réussi à afficher un bouton sur l'écran.

Par contre, lorsque j'essaye d'en afficher un deuxième, celui-ci remplace le premier...
Y-a-t-il une méthode ou une astuce pour éviter cette superposition de bouton ?
(Dans mon cas, je pense plus que le 1er bouton est remplacé par le 2ème car dans l'écriture de code, j'écris la même position pour les 2 boutons, donc lorsque la machine lit le code, celui-ci prends en compte le deuxième et "efface" le premier.)

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 12 mars 2015, 14:22
 

C'est tout à fait ça.

Pour afficher un second bouton, il suffit de le positionner dans l'emplacement opposé à celui du premier.

Pour en afficher plus, il faut créer un nouveau JPanel et l'ajouter dans un des 2 emplacements libres (lorsqu'il n'y avait aucun bouton).

Pour ne pas se restreindre au BorderLayout, regardez les documentations et tutoriels pour découvrir d'autres layouts (dispositions).

Avatar Dorian TONA
Re: Exercice 7.18.8
par Dorian TONA, dimanche 29 mars 2015, 23:56
 

Bonsoir,

Mon problème se situe lors de l'assignation d'une commande au bouton créé. J'ai eu beau tester avec les 2 méthodes (getActionCommand et getSource), une fois le jeu lancé, je peut cliquer sur le bouton autant que je le souhaite sans que rien ne se passe. J'ai vérifié plusieurs choses et même corrigés certains problèmes qui ne s'étaient pas encore manifestés (des méthodes en private) mais impossible de faire réagir le jeu au pressage de bouton !

PS : mon code de actionPerformed

if(pE.getSource()==aBoutonLook) this.aEngine.look();

else if(pE.getSource()==aEntryField)  processCommand();

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 30 mars 2015, 11:17
 

À mon avis, le problème ne se situe pas dans actionPerformed, car je pense qu'elle n'est jamais appelée.

Avez-vous bien traité le point 4 de l'aide qui vous est donnée dans l'énoncé ?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, samedi 4 avril 2015, 18:15
 

Un étudiant a écrit :

Bonjour Monsieur,

J'ai réussi à créer un bouton quit mais il n'est pas fonctionnel, c'est à dire que lorsque je clique dessus rien ne se passe. J'ai pourtant essayé de modifier la méthode actionPerformed (qui devrait être appelée à chaque fois qu'un évènement se produit sur le bouton quit ).

Voici comment j'ai procédé pour créer mon bouton :

- Tout d'abord, j'ai importé la classe JButton dans la classe UserInterface qui permet de créer les composants boutons

- Puis, j'ai déclaré l'attribut boutonQuitter de type JButton et je l'ai crée  dans la méthode createGUI() de la classe Game. En effet, cette procédure gère et crée l'interface graphique de la fenêtre, ainsi que ses panels et ses composants.

[code supprimé pour ne pas influencer les futurs lecteurs]

- Puis, j'ai crée un panel, nommé panelBoutons, qui accueillera les  boutons.

- Ensuite, j'ai ajouté le bouton boutonQuitter à ce panel grâce à la méthode add

- Puis, j'ai placé le panel panelBoutons à l'est de la fenêtre myFrame :
myFrame.getContentPane().add(panelBoutons, BorderLayout.EAST);


- J'ai aussi ajouté l'écouteur d'évènement (actionListener) pour le bouton.

- Enfin, dans la procédure actionPerformed, j'ai enlevé l'instruction processCommand() ; et je l'ai remplacé par :
if (e.getSource() == entryField) {processCommand();}

Cette instruction signfie que si le composant qui a généré l'évènement est une entryField (texte entré dans l'interface textuelle ) alors on appelle la méthode processCommand().

Et j'ai rajouté l'instruction suivante pour le cas où un évènement se produit sur le bouton boutonQuitter :
if(e.getSource()==boutonQuitter) {engine.interpretCommand("quit");}

Cette instruction signifie que si le composant qui a généré l'évènement a pour source le bouton boutonQuitter, alors la machine doit interpréter cette action comme une commande quit.

Je ne comprends pas pourquoi lorsque je clique sur le bouton, rien ne passe.
Pourriez-vous, s'il-vous-plaît, m'éclairer sur mon problème ?

Merci d'avance,
Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, samedi 4 avril 2015, 18:30
 

1)
- "
j'ai placé le panel panelBoutons à l'est de la fenêtre myFrame"
Il vaut mieux l'ajouter au panel (comme les 3 autres composants graphiques déjà présents) plutôt qu'à myFrame.
Mais ce n'est pas cela qui cause votre problème.

2)
- "
Et j'ai rajouté l'instruction suivante pour le cas où un évènement se produit sur le bouton boutonQuitter"
Il ne faut pas oublier le else, car si votre bouton fonctionnait, il serait activé après l'exécutio
n de chaque commande tapée dans l'entryField !

3)
- if(e.getSource()==boutonQuitter) {engine.interpretCommand("quit");}
Ce problème n'était pas facile à trouver, car cette ligne est habituellement correcte.
Mais comme vous avez placé votre bouton dans un JPanel, cela ne fonctionne plus.
Il vous faut donc utiliser getActionCommand() au lieu de getSource() (voir l'aide dans l'énoncé ci-dessus).

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 14 mars 2016, 22:38
 

Un étudiant a écrit :

Bonsoir Monsieur Bureau,

Je tente actuellement d'ajouter un bouton sur mon jeu Java.
J'ai réussi à l'implémenter, le bouton est bien présent, mais je n'arriver pas à lui donner une action. 
Voici ce que j'ai fait dans la procédure actionPerformed

if(e.getSource()== aBouton)
          aBouton.getActionCommand();
    else processCommand();

je sais que ce n'est pas suffisant mais je n'arrive pas à avancer. Peut-être pourriez-vous me mettre sur la voie.
Cordialement,
Merci.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 14 mars 2016, 23:04
 
  1. getActionCommand, comme son nom l'indique, est un accesseur, qui retourne une String (généralement, celle inscrite sur le bouton).
    Donc, si le texte de votre bouton est "Coucou", votre code est strictement équivalent à :
    if (e.getSource()== aBouton)
        "Coucou";
    else
        processCommand();

    ce qui n'exécute pas grand-chose dans le 1er cas ...

  2. D'autre part, ce qui vous manque pour avancer est contenu dans cette phrase du point 5 de l'aide :
    "Il nous faut donc maintenant tester si l'évènement ne serait pas plutôt un clic sur le bouton, et dans ce cas, déclencher l'action correspondante."

  3. Enfin, cela peut vous être profitable de lire la plupart des échanges ci-dessus.

  4. Si tout ça ne suffit pas, reposez une question précise, par rapport au point où vous en serez arrivé.
Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 24 octobre 2016, 21:36
 

Un étudiant a écrit :

Je suis totalement perdu pour la création d'un bouton qui correspond à l'exercice 7.18.8.

Je sais seulement que la classe JButton permet de créer des boutons.
Pour le moment j'ai déclarer un attribut de type JButton ( private JButton bouton) puis j'ai ajouter l'instruction suivante dans la procédure createGUI():   bouton= new JButton("help"); 

Je sais que je doit définir la taille et l'endroit où doit se trouver le bouton et son action mais je ne sais pas comment procéder.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 24 octobre 2016, 21:42
 

D'abord, vous n'êtes pas totalement perdu puisque vous avez su déclarer et créer le bouton.

Pour la suite, effectuez point par point les 5 étapes de l'aide (en bleu) dans l'énoncé de cet exercice, et reposez une question précisément là où vous êtes bloqué.

A propos de votre dernière phrase, vous n'avez pas besoin de définir la taille du bouton (qui s'adaptera au texte que vous choisirez), mais vous devez effectivement choisir laquelle des 5 positions possibles il devra occuper (voir la documentation de la classe BorderLayout).

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 26 mars 2018, 18:46
 

Un étudiant a écrit :

Puisque nous devons coder au moins un bouton, est-il possible de faire en sorte que mon jeu ne repose que sur des boutons afin d'améliorer l'expérience du joueur ?
Si oui, la classe Command devient obsolète non ?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, lundi 26 mars 2018, 18:50
 

Possible ? Oui. Facile ? Non. (pensez à "prendre un objet", par exemple, à partir de l'exercice 30)

Même si vous arrivez à tout faire avec des boutons, il faudra conserver la structure interne du jeu avec la classe Command, ne serait-ce que pour la commande test (à partir de l'exercice 27).

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 27 février 2020, 17:54
 

Un étudiant a écrit :

Je ne comprends pas plusieurs choses:
-Déjà, je dois créer les boutons grâce à la classe JPanel?
-Où dois-je créer mon bouton? Dans une nouvelle méthode que je mettrais dans la classe UserInterface? Dans une méthode déjà existante comme actionPerformed?

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, jeudi 27 février 2020, 18:22
 

J'ai l'impression que vous n'avez pas lu attentivement l'aide fournie dans l'énoncé ci-dessus.

  1. "créer les boutons grâce à la classe JPanel ?"
    Pensez-vous vraiment que Panel veut dire bouton en anglais ?
    Avez-vous simplement essayé de taper "ajouter un bouton en java" dans Google ?
    Par contre, si vous parlez de placer le bouton, il faudra effectivement le faire au sein du JPanel, à une des 2 places restantes.

  2. "créer mon bouton Dans une nouvelle méthode ?"
    Pourquoi ne voulez-vous pas créer votre bouton à l'endroit où sont créés les 3 composants existants (image, listScroller, entryField) ?

  3. "Dans une méthode déjà existante comme actionPerformed? "
    Le point 5 de l'aide explique bien que cette méthode est appelée automatiquement quand on clique sur le bouton ; ça ne semble pas être un très bon choix pour créer le bouton ...

Si tout ça ne suffit pas, posez de nouvelles questions par rapport à ce que vous aurez déjà réussi à faire.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, vendredi 13 mars 2020, 12:48
 

Un étudiant a écrit :

Dans l'exercice 7.18.8, on nous demande d'ajouter un bouton, chose faite. J'en ai ajouté pour chaque commande, ils sont tous fonctionnels, mais dans la zone de texte le jeu affiche d'abord "I don't know what you mean..." puis il affiche la commande et ses sorties ou options comme prévu :

Je n'arrive pas à trouver pourquoi ce message apparaît alors qu'il exécute quand même l'action souhaitée.

Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, vendredi 13 mars 2020, 12:52
 

1) Trouvez à quelle ligne L1 dans le code est affiché le message "I don't know what you mean...".

2) Trouvez à quelle ligne L2 dans le code est appelée la méthode qui contient la ligne L1.

3) Si un if figure dans la méthode contenant L2, voyez dans quel cas L2 est exécutée et dans quel cas elle ne l'est pas.

4) Modifiez le code pour que L2 ne soit exécutée que lorsqu'on ne clique pas sur un bouton.

Avatar Melisa KOCKAN
Re: Exercice 7.18.8
par Melisa KOCKAN, dimanche 15 novembre 2020, 15:35
 

Bonjour Monsieur,

J'ai bien réussi à positionner mon bouton que j'ai nommé "help".
Lorsque je clique dessus, il exécute bien printHelp.
Les autres commandes restent fonctionnelles lorsque je les saisis dans l'entry field.
Cependant, lorsque j'écris help dans l'entry field , printHelp s'execute mais "help" reste affiché dans l'entry field (voir pièce jointe).
Pouvez-vous me donner une piste pour résoudre ce problème s'il vous plaît ?


Avatar Denis BUREAU
Re: Exercice 7.18.8
par Denis BUREAU, dimanche 15 novembre 2020, 17:05
 

1)
"Lorsque je clique dessus, il exécute bien printHelp."
Dans ce cas, help ne s'affiche pas dans l'entry field ?

2)
"Les autres commandes restent fonctionnelles lorsque je les saisis dans l'entry field."
Les autres commandes ne restent pas affichées dans l'entry field ?