Envoyé par
rg77140
Bonjour,
Il faut que ta variable notifie un observateur quand elle change d'état, c'est ensuite ton observateur qui met à jour la vue. C'est le principe du patron Observeur/Observateur. Je te montre un exemple que tu peux jouer :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class TestPatronObserveur {
public static void main(String[] args) throws InterruptedException {
MonModele monModele = new MonModele();
MaFenetre maFenetre = new MaFenetre();
MonObserveur monObserveur = new MonObserveur(maFenetre);
monModele.addObserver(monObserveur);
while (true) {
monModele.incrementerMaVariable();
}
}
public static class MonModele extends Observable {
private int maVariable = 0;
public void incrementerMaVariable() {
maVariable++;
setChanged();
notifyObservers();
}
public int getMaVariable() {
return maVariable;
}
}
public static class MonObserveur implements Observer {
private MaFenetre fenetre;
public MonObserveur(MaFenetre fenetre) {
this.fenetre = fenetre;
}
@Override
public void update(Observable o, Object arg) {
fenetre.afficherVariable(((MonModele) o).getMaVariable());
}
}
public static class MaFenetre {
JFrame frame = new JFrame("Etat de mon modèle en direct");
JTextArea champTexte = new JTextArea();
public MaFenetre() {
frame.getContentPane().add(champTexte, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
public void afficherVariable(int variable) {
champTexte.setText(String.valueOf(variable));
}
}
} |
Tu peux chercher "pattern MVC" (Modèle Vue Contrôleur) ou "pattern observer/observable" sur Internet tu trouveras pas mal de ressources.
Romain.
Je trouve ça lourd moi de devoir déporter une variable dans un Observable pour pouvoir la mettre à jour dans une vue. Et s'il faut implémenter Observable sur toutes les classes contenant des variables susceptibles d'être affichées quelque part, je trouve ça lourdingue aussi.
Alors que tu peux tout aussi bien appeler directement :
public void afficherVariable(int variable)
à chaque fois que tu modifies ta variable (éventuellement avec un invokeLater)
Je dis pas s'il y avait plusieurs vues affichant des dizaines de données, mais un jtextfield unique pour afficher une seule variable...
Partager