Le code source des énoncés (en UTF-8) est dans le répertoire enonce/
Question 1
Question facultative, car utilise le mécanisme java déprecié en java 9.Si vous voulez exécuter
test1()
sans voir les erreurs générées par les méthodes suivantes, commentez test2()
et test3()
.
Question 2
Question 2.1
On a donc des boutons, et on veut qu'ils réagissent si on clique dessus.Les boutons sont les observables ; en swing, les observateurs sont des classes implémentant
EventListener
.
Pour savoir quel type de listener utiliser, on peut aller voir le javadoc de la classe
JButton
, on arrive vite à la conclusion qu'il nous faut ici un ActionListener
.
Un début du listener est fourni par l'énoncé :
JButtonObserver
.
Dans cette classe, il faut donc compléter :
public class JButtonObserver implements ActionListener{et implémenter la seule méthode de l'interface :
actionPerformed
Pour l'implémentation, l'énoncé vous aide en vous disant d'aller voir
getActionCommand()
, une méthode de ActionEvent
.
Une fois que le listener est écrit, on peut l'utiliser :
Dans le code de IHMQuestion2_1, en reprenant les conseils donnés dans les commentaires, on le crée de cette manière :
JButtonObserver jbo1 = new JButtonObserver("jbo1", contenu);Puis on l'enregistre comme observateur du bouton :
boutonA.addActionListener(jbo1);Avec ces indications, vous devriez pouvoir reproduire exactement le comportement de l'applet.
Question 2.2
Dans la fonctionIHMQuestion2_2.main()
, on peut supprimer la ligne :
new IHMQuestion2_1();On a besoin d'un type différent de listener pour déclencher une action lorsque la souris entre dans la zone d'affichage du bouton. A l'aide de javadoc, on peut voir que c'est un
MouseListener
qui nous intéresse. Un début d'implémentation est fourni par JMouseObserver
.
Pour trouver les méthodes à utiliser pour reproduire le comportement de l'énoncé, c'est dans le javadoc de
MouseEvent
.
Cette question est très similaire à la question 2.1, vous avez tous les éléments pour pouvoir l'implémenter.
Question 3
Question 3.1
Compléments d'énoncé
-
Sous dos, exécutez la version opérationnelle de l'applet :
appletviewer http://jfod.cnam.fr/progAvancee/tp4/tp4.html
- Compiler le package tp3
- Compléter et compiler PileModele.java
- Compiler Controleur.java, Vue.java, IHMCalculette.java
- Exécuter IHMCalculette.java
Compléter
Vue.java
pour en faire un observateur incrit auprès du modèle.
Le gros du travail consiste à implémenter
Controleur.java
Indications pour la réponse
Bien identifier les acteurs en jeu.Point de vue UI, on a :
- La zone en vert est un
JPanel
implémenté dans la classe Vue
.
- La zone de saisie et les boutons sont dans un
JPanel
implémenté dans la classe Controleur
.
- Ces deux
JPanel
sont placés dans un JFrame
créé dans IHMCalculette
.
Une seule instance du modèle est créee ; la vue et le modèle peuvent y accéder (le modèle est passé en paramètre dans les constructeurs).
Compléter PileModele
L'énoncé donne la moitié de la réponse : empiler()
contient déjà le code de notification des observateurs.
La seule autre méthode qui modifie l'état de la pile et qui doit générer une notification des observateurs est
depiler()
, qui est à compléter.
Compléter Controleur
Comme d'habitude, on doit associer des listeners aux boutons.
Ici aussi, on peut utliser des
ActionListener
.
L'énoncé indique que les listener doivent être gérés localement par le contrôleur.
Il faut donc créer des classes internes, membres privés de la classe
Controleur
.
On va appeler ces classes
XXXOperation
, XXX étant le nom du bouton concerné - par exemple PushOperation
, AddOperation
...
Exemple pour le listener du bouton push (dans le code de
Controleur
) :
private class PushOperation implements ActionListener{ public void actionPerformed(ActionEvent ae){ try{ pile.empiler(operande()); } catch(NumberFormatException nfe){ } catch(PilePleineException e){ } actualiserInterface(); } }On peut associer ce listener au bouton push :
boutons.add(push); push.addActionListener(new PushOperation());De la même manière, on peut implémenter les autres listeners.
L'énoncé donne à implémenter
actualiserInterface()
; c'est indispensable pour enable ou disable les boutons.
Voila un bout de la réponse :
public void actualiserInterface() { if (pile.estPleine()){ push.setEnabled(false); } else if (pile.taille()==0){ push.setEnabled(true); // à compléter }else if (pile.taille()==1){ // à compléter } // à compléter }Pour vous aider, vous pouvez faire le diagramme de séquence qui traduit ce qui se passe :
- L'utilisateur clique sur un bouton
Controleur.XXXOperation.actionPerformed()
est appeléeactionPerformed()
appellePileModele.empiler()
oudepiler()
empiler()
oudepiler()
vont appelersetChanged()
etnotify()
- Cela va déclencher l'appel de
Vue.update()
et la zone en vert sera mise à jour