Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
759 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Pattern Observer/Observable : petit souci

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pattern Observer/Observable : petit souci

n°2040681
serial_xp
Posté le 08-12-2010 à 10:13:23  profilanswer
 

Bonjour a tous,  
 
Je suis entrain de finaliser un projet pour ma fac mais je me trouve face a un souci de taille...
 
Nous sommes obligés d'utiliser le modèle MVC. Vu que je n'arrive pas a le faire fonctionner sur mon projet, j'ai décidé de le tester sur une classe bidon mais cela ne fonctionne pas. Si quelqu'un pouvait me donner une indication car j'ai surement fait une boulette quelque part mais comme ça, de prima-bord, je ne vois pas.
 
Classe observable :  
 

Code :
  1. import java.util.Observable;
  2. public class TestString extends Observable {
  3.     String a;
  4.    
  5.     TestString(){
  6.         super();
  7.         a = "";
  8.     }
  9.    
  10.     void modifyString(String s) {
  11.         a = s;
  12.         setChanged();
  13.         notifyObservers();
  14.     }
  15.    
  16.     String getString() {
  17.         return a;
  18.     }
  19. }


Classe utilisant l'observeur :  
 

Code :
  1. import java.awt.FlowLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.util.Observable;
  5. import java.util.Observer;
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JPanel;
  10. import javax.swing.JTextField;
  11. public class Interface extends JFrame implements Observer, ActionListener{
  12.     TestString a;
  13.     JButton ok;
  14.     JTextField text;
  15.     JLabel resp;
  16.    
  17.     Interface() {
  18.         super();
  19.         a = new TestString();
  20.         build();
  21.         a.addObserver(this);
  22.     }
  23.    
  24.     void build() {
  25.         setSize(400, 100);
  26.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  27.         setContentPane(buildContentPane());
  28.     }
  29.    
  30.     JPanel buildContentPane() {
  31.         JPanel p = new JPanel();
  32.         p.setLayout(new FlowLayout());
  33.         resp = new JLabel(a.getString());
  34.         ok = new JButton("OK" );
  35.         ok.addActionListener(this);
  36.         ok.setActionCommand("OK" );
  37.         text = new JTextField(10);
  38.        
  39.         p.add(text);
  40.         p.add(ok);
  41.         p.add(resp);
  42.        
  43.         return p;
  44.     }
  45.     @Override
  46.     public void actionPerformed(ActionEvent e) {
  47.         Object source = e.getActionCommand();
  48.         if (source == "OK" ) {
  49.             a.modifyString(text.getText());
  50.             text.setText("" );
  51.             update(a, this);
  52.         }
  53.     }
  54.    
  55.     @Override
  56.     public void update(Observable obs, Object obj) {
  57.         if (obs.hasChanged()) {
  58.             this.repaint();
  59.         }
  60.     }
  61. }


Le code n'étant pas commenté, il s'agit d'une bête fenêtre contenant un text field avec un bouton pour valider, afin de mettre a jour le label.
 
Merci d'avance pour votre aide.


Message édité par serial_xp le 08-12-2010 à 10:43:09
mood
Publicité
Posté le 08-12-2010 à 10:13:23  profilanswer
 

n°2040708
Bidem
Posté le 08-12-2010 à 11:40:28  profilanswer
 

Citation :

mais cela ne fonctionne pas


Qu'est ce que tu attends comme comportement et que se passe-t-il ?
 

Citation :

Code :
  1. if (source == "OK" ) {



Mauvaise façon de tester l'egalité d'une chaine : utilise la méthode equals
 
Dans actionPerformed, tu appelles explicitement la méthode update...
Le but du pattern Observer/Observable c'est justement de ne pas avoir à faire cet appel.

n°2040923
serial_xp
Posté le 08-12-2010 à 17:31:37  profilanswer
 

N'ayant pas encore eu de cours sur les UI a la fac et devant faire un gestionnaire de contacts, j'ai pensé en profiter pour ma faire la main sur les UI.  
 
Le problème est que j'ai du mal avec ce pattern.
 
Je voudrais juste que le texte entré dans le text field apparaisse dans le label (histoire de comprendre les étapes de fonctionnement et pour pouvoir l'appliquer a mon projet).

n°2040966
Bidem
Posté le 09-12-2010 à 09:46:28  profilanswer
 

Citation :

Je voudrais juste que le texte entré dans le text field apparaisse dans le label (histoire de comprendre les étapes de fonctionnement et pour pouvoir l'appliquer a mon projet).


 
Le principe de l'Observer/Observable est :
- l'Observable (TestString) notifie ses changements via les méthodes setChanged et notifyObservers. C'est ce que tu as fais.
-l'Observer traite ces notifications dans la méthode update.
 
Là, ce qu'il te manque c'est que dans la méthode update il faut mette à jour la valeur de ton label.

n°2040969
serial_xp
Posté le 09-12-2010 à 10:10:32  profilanswer
 

D'accord.
 
Je crois que je viens de comprendre.
 
Dans la fonction update, je peux redessiner l'ensemble de la fenêtre en faisant un "this.repaint()"?
 
(j'ai testé avec un repaint mais ca ne fonctionne pas)

n°2040975
Bidem
Posté le 09-12-2010 à 10:23:06  profilanswer
 

Avant d'essayer de faire un repaint, il faut que tu mettre la valeur de ton label à jour :

Code :
  1. if (obs.hasChanged()) {
  2.   TestString test = (TestString) obj;
  3.   resp.setText(test.getString());
  4.   this.repaint();
  5. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Pattern Observer/Observable : petit souci

 

Sujets relatifs
quel pattern utiliserKcfinder si quelqu'un connait: Petit bug d'affichage...
[Java]Petit problème interface graphiquepetit programme de tri en c
Petit problème lors de la création d'une table.Coder un petit jeu
Petit pb expressions régulièresDesign pattern IoC
jasypt / petit soucis d'encryption sha / openldapcréation d un petit programme
Plus de sujets relatifs à : Pattern Observer/Observable : petit souci


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR