TP4 - infos supplémentaires

Copie locale de l'énoncé de Paris
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 fonction IHMQuestion2_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é

L'IHM ne fait rien pour l'instant, mais on a un résultat visuel en local.

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 :

Question 3.2

Voir énoncé, analyser le problème en oubliant tout ce qui a été fait précédemment.

Question 3.3

A faire en partant du code de la question 3.1