// -*- 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(); } }