Pattern MVC - CommentCaMarche ? [Débutant]

Résolu/Fermé
Jahgan974 Messages postés 17 Date d'inscription mardi 20 novembre 2012 Statut Membre Dernière intervention 19 février 2014 - 16 déc. 2012 à 14:33
Jahgan974 Messages postés 17 Date d'inscription mardi 20 novembre 2012 Statut Membre Dernière intervention 19 février 2014 - 16 déc. 2012 à 15:15
Bonjour à vous.

Je viens tout juste de commencer la programmation et je me suis intéressé à la programmation évènementielle en JAVA.
J'ai découvert le pattern MVC qui me parait être une manière de développé plutôt sympathique.
J'ai donc décidé de coder un petit compteur, qui s'incrémente ou décrémente selon que l'utilisateur appuie sur le bouton "+" ou le bouton "-".
Rien de bien difficile me direz-vous. Mais il s'avère que je ne suis malheureusement pas doué. Et j'ai donc décidé de faire appel à vous.

Mon problème est le suivant : mon JLabel qui affiche l'état actuel du compteur, ne se ré-affiche pas lorsque l'utilisateur clique sur l'un des boutons.

Pouvez-vous me dire où se trouve l'erreur s'il vous plait ?
/*-----------------------------------------------*/
/*---------------- MODEL -----------------*/
public class Modele extends Observable {
private int count;

public Modele(){
count = 0;
}

public void plus(){
count++;
setChanged();
notifyObservers();
}

public void moins(){
count--;
setChanged();
notifyObservers();
}

public int affiche(){
return count;
}
}
/*----------------------------------------*/
/*---------------- VUE -----------------*/
public class Vue extends JFrame implements Observer{
Modele m;
Controler c;

JButton plus, moins;
JLabel afficheur;

public Vue(){
this.setResizable(false);
this.setTitle("Compteur");
this.setVisible(true);
this.getContentPane().setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

m = new Modele();
c = new Controler(this);

afficheur = new JLabel();
afficheur.setHorizontalAlignment(SwingConstants.CENTER);
afficheur.setText(m.affiche());

plus = new JButton("+");
plus.addActionListener(c);
moins = new JButton("-");
moins.addActionListener(c);

this.getContentPane().add(plus, BorderLayout.WEST);
this.getContentPane().add(afficheur, BorderLayout.CENTER);
this.getContentPane().add(moins, BorderLayout.EAST);

this.pack();
}

public void affichage(){
afficheur.setText(m.affiche());
}

public void update(Observable arg0, Object arg1) {
this.affichage();
}

public static void main(String args[]){
new Vue();
}
}
/*-----------------------------------------------*/
/*---------------- CONTROLER -----------------*/
public class Controler implements ActionListener{
Vue vue;
Modele m;

public Controler(Vue v){
vue=v;
m=vue.m;

}

public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().toString()=="+"){
m.plus();
}
else{
m.moins();
}
}
}
A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 déc. 2012 à 15:00
1) Erreur à la compilation sur afficheur.setText(m.affiche()); en effet affiche() renvoie un int, quand setText attend un String :
afficheur.setText(String.valueOf(m.affiche()));
2) Dans actionPerformed, grosse erreur sur e.getActionCommand().toString()=="+", il ne faut jamais comparer deux String avec == qui compare les références des objets mais pas leurs valeurs.

3) De plus, il te manque à ce niveau là un appel de mise à jour de l'affichage :

public void actionPerformed(ActionEvent e)
{
    if (e.getActionCommand().equals("+"))
        m.plus();
    else
        m.moins();

    vue.affichage();
}

Personnellement je ne connais pas le pattern MVC, mais je trouve cela bien compliqué pour si peu de choses à faire...

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Vue extends JFrame
{
    private static final long serialVersionUID = 1;

    public Vue()
    {
        final JButton plus = new JButton("+");
        add(plus, BorderLayout.WEST);
        
        final JLabel afficheur = new JLabel("0",JLabel.CENTER);
        add(afficheur, BorderLayout.CENTER);
        
        final JButton moins = new JButton("-");
        add(moins, BorderLayout.EAST);
        
        plus.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int n = Integer.parseInt(afficheur.getText());
                afficheur.setText(String.valueOf(n+1));
            }
        });
        
        moins.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int n = Integer.parseInt(afficheur.getText());
                afficheur.setText(String.valueOf(n-1));
            }
        });
        
        setTitle("Compteur");
        pack();
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    
    public static void main(String[] args)
    {
        new Vue();
    }
}
0
Jahgan974 Messages postés 17 Date d'inscription mardi 20 novembre 2012 Statut Membre Dernière intervention 19 février 2014
16 déc. 2012 à 15:15
Merci beaucoup KX ! Pour ton efficacité et ta spontanéité !

Effectivement pour cet exemple le model MVC n'est pas forcément le plus efficace.
Mais pour les gros projets il serait peut être intéressant de pouvoir séparer les différents éléments tels que l'interface graphique, les données et leur gestions etc...

Enfin en tout cas je te remercie une fois de plus et je retourne à mon apprentissage.


Sujet Résolu.
0