[java]listener de modification

listener de modification [java] - Java - Programmation

Marsh Posté le 11-04-2005 à 13:48:56    

Bonjour,
En fait j 'ai une classe A avec un attribut :
int compteur;
 
ce que j aimerais c est que lorsque la valeur de cet attribut compteur est modifié une seconde classe B reagisse et effectue certaines operations.
 
J'ai lu ce sujet qui semble etre mon probleme :
 
http://forum.hardware.fr/forum2.ph [...] 90#t982255
 
mais n'etant pas une tete en Java je n'ai pas trop compris la solution proposée.
 
Merci pour votre attention.
Cordialement, Pata.

Reply

Marsh Posté le 11-04-2005 à 13:48:56   

Reply

Marsh Posté le 11-04-2005 à 18:44:12    

Bonjour,
 
Voici une solution basique, sans Listener, mais qui ne convient que dans les cas simples.
 
Si l'instance de B est connue de A (par exemple créée par A ou passée en paramètre à A), il suffit :
 
(1) de créer dans A une méthode incrementeCompteur(int i) qui incrémente le compteur de i unités ;
 
(2) de toujours passer par cette méthode pour incrémenter le compteur (ne pas faire de "compteur += 1" ailleurs) ;
 
(3) dans cette méthode, de lancer une action sur B.
 
Nicolas

Reply

Marsh Posté le 11-04-2005 à 23:26:51    


Une méthode plus pure :
 
 

Code :
  1. import java.util.*;
  2. class ClasseA extends Observable {
  3.    
  4.     private int compteur = 0;
  5.    
  6.     public int getCompteur() {
  7.         return compteur;
  8.     }
  9.    
  10.     public void incrementeCompteurDe(int i) {
  11.         compteur += i;
  12.         System.out.println("L'instance de classeA a son compteur qui passe à "+compteur+" ; elle notifie les observateurs." );
  13.         setChanged();
  14.         notifyObservers(compteur);
  15.     }
  16.    
  17. }
  18. class ClasseB implements Observer {
  19.    
  20.     private String nomInstance = "";
  21.    
  22.     public ClasseB(String s) {
  23.         nomInstance = s;
  24.     }
  25.    
  26.     public void update(Observable o, Object arg) {
  27.         System.out.println(nomInstance+" a été averti d'un changement dans l'objet qu'il observe, et dont le compteur est passé à "+arg);
  28.     }
  29. }
  30. public class MonTest {
  31.    
  32.     public static void main(String[] args) {
  33.         ClasseA maClasseA = new ClasseA();
  34.         ClasseB observateur1 = new ClasseB("Observateur1 (ClasseB)" );
  35.         ClasseB observateur2 = new ClasseB("Observateur2 (ClasseB)" );
  36.         maClasseA.addObserver(observateur1);
  37.         maClasseA.addObserver(observateur2);
  38.         for (int i=0; i<3; i++) {
  39.             System.out.println("**" );
  40.             maClasseA.incrementeCompteurDe(1);
  41.             try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}
  42.         }
  43.     }
  44. }


 
Nicolas

Reply

Marsh Posté le 11-04-2005 à 23:29:40    

je précise que ton exemple ne marche à partir de java1.5 (utilisation de l'autoboxing)

Reply

Marsh Posté le 12-04-2005 à 01:13:21    

Ce serait plus simple avec un PropertyChangeListener non :??:

Reply

Marsh Posté le 12-04-2005 à 22:39:53    


(1) Pour utiliser "directement et facilement" addPropertyChangeListener, ne faut-il pas que la classe écoutée dérive de JComponent et que l'on écoute des propriétés pré-établies ?
 
API de JComponent :

public void addPropertyChangeListener(PropertyChangeListener listener)Adds a PropertyChangeListener to the listener list. The listener is registered for all bound properties of this class, including the following:  
this Component's font ("font" )  
this Component's background color ("background" )  
this Component's foreground color ("foreground" )  
this Component's focusability ("focusable" )  
this Component's focus traversal keys enabled state ("focusTraversalKeysEnabled" )  
this Component's Set of FORWARD_TRAVERSAL_KEYS ("forwardFocusTraversalKeys" )  
this Component's Set of BACKWARD_TRAVERSAL_KEYS ("backwardFocusTraversalKeys" )  
this Component's Set of UP_CYCLE_TRAVERSAL_KEYS ("upCycleFocusTraversalKeys" )  
this Component's preferred size ("preferredSize" )  
this Component's minimum size ("minimumSize" )  
this Component's maximum size ("maximumSize" )  
this Component's name ("name" )


Cf. également ce tutoriel :
http://java.sun.com/docs/books/tut [...] tener.html
 
(2) Dans le cas général, en s'inspirant de :
http://forum.hardware.fr/forum2.ph [...] 90#t982255
et
http://www.imsc.res.in/Computer/lo [...] bound.html
 
on peut probablement proposer pour notre exemple le code suivant :
 

Code :
  1. // Appeler la classe MonTest3.java
  2. import java.awt.*;
  3. import java.beans.*;
  4. class ClasseA {
  5.    
  6.     private int compteur = 0;
  7.    
  8.     public int getCompteur() {
  9.         return compteur;
  10.     }
  11.    
  12.     public void incrementeCompteurDe(int i) {
  13.         int oldValue = compteur;
  14.         compteur += i;
  15.         System.out.println("L'instance de classeA a son compteur qui passe à "+compteur+" ; elle notifie les observateurs." );
  16.         propertyChangeSupport.firePropertyChange("compteur", oldValue, compteur);
  17.     }
  18.    
  19.     private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
  20.    
  21.     public void addPropertyChangeListener(PropertyChangeListener listener) {
  22.         propertyChangeSupport.addPropertyChangeListener(listener);
  23.     }
  24.    
  25.     public void removePropertyChangeListener(PropertyChangeListener listener) {
  26.         propertyChangeSupport.removePropertyChangeListener(listener);
  27.     }
  28. }
  29. class ClasseB {
  30.    
  31.     private String nomInstance = "";
  32.    
  33.     public ClasseB(String s, ClasseA classeAobservee) {
  34.         nomInstance = s;
  35.         classeAobservee.addPropertyChangeListener(new PropertyChangeListener() {
  36.             public void propertyChange(PropertyChangeEvent pce) {
  37.                 System.out.println(nomInstance+" a été averti d'un changement dans l'objet qu'il observe, et dont le compteur est passé de "+pce.getOldValue()+" à "+pce.getNewValue());
  38.             }
  39.         }
  40.         );
  41.     }
  42. }
  43. public class MonTest3 {
  44.    
  45.     public static void main(String[] args) {
  46.         ClasseA maClasseA = new ClasseA();
  47.         ClasseB observateur1 = new ClasseB("Observateur1 (ClasseB)", maClasseA);
  48.         ClasseB observateur2 = new ClasseB("Observateur2 (ClasseB)", maClasseA);
  49.         for (int i=0; i<3; i++) {
  50.             System.out.println("**" );
  51.             maClasseA.incrementeCompteurDe(1);
  52.             try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}
  53.         }
  54.     }
  55. }


 
C'est tout de même un tout petit plus compliqué que Observer/Observable.
Mais tout dépend de ce que l'on veut faire...
 
Nicolas

Reply

Sujets relatifs:

Leave a Replay

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