// -*- Coding: utf-8 -*-
// Time-stamp: <Mvc.java 14 déc 2015 09:03:05>
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Exemple PlusOuMoins en Model/View/Controler d'après J. Berstel
* @version 1.0
*/
class Mvc {
// Constructeur
public Mvc() {
// Création du modèle
Model model = new Model();
// Création du contrôleur
Controler controler = new Controler(model);
// Création de la vue
View view = new View(model, controler);
controler.setView(view);
// Affichage de la vue
view.setVisible(true);
}
public static void main(String [] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Création
Mvc mvc = new Mvc();
}
});
}
}
/**
* Bouton avec valeur incrémentale
*/
class IncrButton extends JButton {
private int incr; // Valeur de l'incrément
IncrButton(String title, int incr) {
// Constructeur avec titre
super(title);
// Initialisation de l'incrément
this.incr = incr;
}
// Retourne la valeur d'incrément
int getIncr() { return incr; }
}
/**
* Modèle contenant les données
* Les données sont constituées d'un seul entier.
*/
class Model {
private int value; // Données du modèle
Model(int value) { this.value = value; }
Model() { this(0); }
void incrValue(int incr) { value += incr; }
int getValue() { return value; }
}
/**
* Vue affichant les données
*/
class View extends JFrame {
final int width = 150; // Largeur de la fenêtre
final int height = 20; // Hauteur de la fenêtre
Model model; // Modèle contenant les données
JLabel label; // Étiquette d'affichage
View(Model model, Controler controler) {
// Constructeur avec titre
super("Plus ou moins");
// Initialisation du modèle
this.model = model;
// Dimension de la fenêtre
setSize(width, height);
// Action à faire lorsque la fenêtre est fermée.
setDefaultCloseOperation(EXIT_ON_CLOSE);
// Création du champ d'affichage de la valeur
label = new JLabel(Integer.toString(model.getValue()), JLabel.CENTER);
// Création des deux Boutons écoutés par le contrôleur
JButton plusButton = new IncrButton("+", +1);
plusButton.addActionListener(controler);
JButton moinsButton = new IncrButton("-", -1);
moinsButton.addActionListener(controler);
// Mise en place des éléments dans un panneau
JPanel mainPanel = (JPanel) getContentPane();
mainPanel.setLayout(new BorderLayout());
mainPanel.add(plusButton,BorderLayout.EAST );
mainPanel.add(label,BorderLayout.CENTER );
mainPanel.add(moinsButton, BorderLayout.WEST);
}
// Mise à jour de l'affichage à partir des données du modèle
void update() {
label.setText(Integer.toString(model.getValue()));
}
}
/**
* Contrôleur
*/
class Controler implements ActionListener {
Model model; // Modèle contenant les données
View view; // Vue des données
Controler(Model model) { this.model = model; }
void setView(View view) { this.view = view; }
// Action sur reception d'un événement
public void actionPerformed(ActionEvent event) {
// Bouton émetteur de l'événement
IncrButton button = (IncrButton) event.getSource();
// Mise à jour des données
model.incrValue(button.getIncr());
// Force la vue à être conforme aux données
view.update();
}
}