Pattern Observer/Observable : petit souci

Pattern Observer/Observable : petit souci - Java - Programmation

Marsh Posté le 08-12-2010 à 10:13:23    

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
Reply

Marsh Posté le 08-12-2010 à 10:13:23   

Reply

Marsh Posté le 08-12-2010 à 11:40:28    

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.

Reply

Marsh Posté le 08-12-2010 à 17:31:37    

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).

Reply

Marsh Posté le 09-12-2010 à 09:46:28    

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.

Reply

Marsh Posté le 09-12-2010 à 10:10:32    

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)

Reply

Marsh Posté le 09-12-2010 à 10:23:06    

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. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed