Explication du MVC - Exemple BoutonVue.java

1. Lancement du programme
  1. Lancer un Applet
  2. Exécution de init():

 

Le système est prêt à interagir avec l'usager

 

2. L'usager clique sur "bonjour"
  1. L'usager clique sur "bonjour". Un événement du type ActionEvent est créé.
  2. Le contrôle capte l'événement, et la méthode actionPerformed est exécutée.
  3. Dans l'exécution de cette méthode, on détermine que l'événement provient de "bonjour". Donc, le modèle est appelé à traiter cet événement (par la méthode changer_message).
  4. Dans le modèle, le traitement changer_message va modifier l'attribut message, et demander à la vue de réafficher la fenêtre.
  5. Dans la vue, la méthode paint affiche le message du modèle dans la fenêtre.
  6. Le traitement de cet événement est terminé. On attend le prochain événement.

 

3. Test du programme en ligne:

http://www.iro.umontreal.ca/~nie/IFT1020/MVC/Bouton/Bouton.html

Programme source - BoutonVue.java

4. Programme:

// Un exemple commente de MVC minimal qui affiche un bouton dans une fenetre.


// Si on clique sur le bouton "bonjour", on verra apparaitre le message
// "Bonjour". Si on clique sur le bouton "effacer", ce message s'efface.

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
class BoutonModele {
// Declaration d'une copie locale de Vue:

private BoutonVue vue;
// Un attribut propre pour le modele:

private String message = "";
// Constructeur qui permet de relier ce modele avec une vue:

BoutonModele(BoutonVue vue) {
this.vue = vue;
}
// Une methode du modele qui traite les demandes de l'usager:

public void changer_message(String message) {
// Un traitement tres simple:

this.message = message;
// Ensuite (s'il faut), on demande a la vue de refaire la fenetre:

vue.repaint();
}
// Cette methode sera utilisee par Vue pour obtenir le message a afficher:

public String getMessage() {
return message;
}
}
public class BoutonVue extends Applet {
// un element graphique - bonjour

private Button bonjour;
private Button effacer;
// des copies locales des references au modele et au controle:

private BoutonModele modele;
private BoutonControle controle;
// methode d'initialisation qui compose la vue, cree un modele et un
// controle, et les relie:

public void init () {
bonjour = new Button("Bonjour");
add(bonjour);
effacer = new Button("Effacer");
add(effacer);
modele = new BoutonModele(this);
controle = new BoutonControle(modele, bonjour, effacer);
// creation du lien d'ecoute aux evenements:

bonjour.addActionListener(controle);
effacer.addActionListener(controle);
}
// methode de Applet pur faire l'affichage:

public void paint (Graphics g) {
// Dans cette methode, on demande au modele de "calculer" le message
// a afficher, on on l'affiche:

g.drawString(modele.getMessage(), 20, 50);
}
}
class BoutonControle implements ActionListener {
// copie locale de la reference au modele:

BoutonModele modele;
// composants auxquels le controle reagit:

private Button bonjour, effacer;
// construicteur qui relie ce controle avec le modele et le bouton:

BoutonControle(BoutonModele modele,
Button bonjour, Button effacer) {
this.modele = modele;
this.bonjour = bonjour;
this.effacer = effacer;
}
// methode de reaction aux evenements:

public void actionPerformed(ActionEvent e) {
if (e.getSource() == bonjour) {
modele.changer_message(bonjour.getLabel());
}
else if (e.getSource() == effacer) {
modele.changer_message("");
}
}
}