ich habe eine Frage zu Bound Properties. Und zwar soll ja die Methode propertyChange() aufgerufen, wenn sich der Wert einer Property ändert. Wenn ich in dieser Methode jetzt einfach mit System.out.println was ausgeben will, muss ich da noch was beachten? Irgendwie funktioniert es nämlich nicht.
Ich setze die Property mit dieser Methode:
Code:
public void setValue(int newValue) {
int old = value;
value = newValue;
propertySupport.firePropertyChange(NAME, old, value);
}
Aufrufen tue ich das ganze einfach mit
Code:
// bb = Objekt der Klasse...
bb.setValue(5);
Vor dem Aufrufen habe ich die Listener-Bean auch angemeldet, indem ich an den Konstruktor das Objekt bb übergebe.
Also wie kriege ich da die Ausgabe, wenn die Property sich verändert?
Hoffe ihr könnt mir helfen und ich bon im richtigen Forum...
ja, die Anmeldung findet dann im Konstruktor statt, also folgendermaßen:
Aufruf in der Main-Datei:
Code:
// Objekt der Bound Bean
BoundProperties bb = new BoundProperties();
// Objekt des Listeners mit Übergabe der Bound Bean
BoundProperties_Listener bbl = new BoundProperties_Listener(bb);
// Ändern der Property in der Bound Bean
bb.setValue(5);
Konstruktor des Listeners:
Code:
// Konstruktor zum Anmelden bei der gewünschten Bean
public BoundProperties_Listener (BoundProperties newBean) {
bean = newBean;
// Anmeldung der Bean als PropertyChangeListener
bean.addPropertyChangeListener(this);
}
sollte doch egentlich so stimmen, oder? Aber ich bekomme keine Ausgabe.
Die set-Methode in der Bound Bean sieht so aus:
Code:
public void setValue(int newValue) {
int oldValue = value;
value = newValue;
propertySupport.firePropertyChange(PNAME, oldValue, value);
}
Die propertyChange Methode in der Listener Bean so:
Code:
public void propertyChange (PropertyChangeEvent event) {
System.out.println("Neuer Wert: "+event.getNewValue());
}
Irgendwie verstehe ich nicht, wo der Fehler liegen soll...
Da Du PropertyChangeSupport verwendest, nehme ich an, dass das Bean-Ding keine
GUI-Komponente ist (Component irgendwo in der Vererbungshierarchie). Oder?
Hast Du auch addPropertyChangeListener implementiert?
'oldValue' und 'value' sind unterschiedlich? (wenn die Werte gleich sind, passiert nix)
GUI-Komponenten sind keine vorhanden.
Die Methoden addPropertyChangeListener() und removePropertyChangeListener() sind auch in der Bean implementiert, nach folgendem Muster:
Code:
public void addPropertyChangeListener (PropertyChangeListener interessent) {
propertySupport.addPropertyChangeListener(interessent);
}
Den Wert der Property setze ich gleich beim Initialisieren:
Code:
private int value = 0;
Beim Aufruf von
Code:
bb.setValue(5);
sollte er sich ja eigentlich ändern und dementsprechend das Event ausführen...
Hmmm, PropertyChangeSupport verwendet sun.awt.EventListenerAggregate,
um die Listener zu verwalten. Das ganze basiert nicht auf WeakReferences
o.ä., so dass es auch nicht an anonymen Listenern liegt.
Ich habe keine Ahnung, warum es nicht geht. Ruf Mulder und Scali an