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