(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 :
- // Appeler la classe MonTest3.java
- import java.awt.*;
- import java.beans.*;
- class ClasseA {
-
- private int compteur = 0;
-
- public int getCompteur() {
- return compteur;
- }
-
- public void incrementeCompteurDe(int i) {
- int oldValue = compteur;
- compteur += i;
- System.out.println("L'instance de classeA a son compteur qui passe à "+compteur+" ; elle notifie les observateurs." );
- propertyChangeSupport.firePropertyChange("compteur", oldValue, compteur);
- }
-
- private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
-
- public void addPropertyChangeListener(PropertyChangeListener listener) {
- propertyChangeSupport.addPropertyChangeListener(listener);
- }
-
- public void removePropertyChangeListener(PropertyChangeListener listener) {
- propertyChangeSupport.removePropertyChangeListener(listener);
- }
- }
- class ClasseB {
-
- private String nomInstance = "";
-
- public ClasseB(String s, ClasseA classeAobservee) {
- nomInstance = s;
- classeAobservee.addPropertyChangeListener(new PropertyChangeListener() {
- public void propertyChange(PropertyChangeEvent pce) {
- 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());
- }
- }
- );
- }
- }
- public class MonTest3 {
-
- public static void main(String[] args) {
- ClasseA maClasseA = new ClasseA();
- ClasseB observateur1 = new ClasseB("Observateur1 (ClasseB)", maClasseA);
- ClasseB observateur2 = new ClasseB("Observateur2 (ClasseB)", maClasseA);
- for (int i=0; i<3; i++) {
- System.out.println("**" );
- maClasseA.incrementeCompteurDe(1);
- try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}
- }
- }
- }
|
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