Реализация ObservableValue<Foo>
, как предполагает ваш слушатель, будет означать, что ваш объект оборачивает Foo
объект, что явно не так.
Для ObservableValue
будут классы для расширения.Для Observable
такого класса не существует, и вы должны реализовать интерфейс самостоятельно.Это можно сделать, добавив / удалив прослушиватели во все свойства Observable
, но для эффективности я рекомендую реализовать это с одним прослушивателем для каждого свойства:
public abstract class ObservableBase implements Observable {
private final List<InvalidationListener> listeners = new ArrayList<>();
protected ObservableBase(Observable... dependencies) {
InvalidationListener listener = o -> {
for (InvalidationListener l : listeners) {
try {
l.invalidated(o);
} catch (RuntimeException ex) {
ex.printStackTrace();
}
}
};
for (Observable o : dependencies) {
o.addListener(listener);
}
}
@Override
public final void addListener(InvalidationListener listener) {
Objects.requireNonNull(listener);
listeners.add(listener);
}
@Override
public final void removeListener(InvalidationListener listener) {
listeners.remove(listener);
}
}
public class Foo extends ObservableBase {
public final BooleanProperty prop1;
public final StringProperty prop2;
// ** more properties ** //
private Foo(BooleanProperty prop1, StringProperty prop2) {
super(prop1, prop2);
this.prop1 = prop1;
this.prop2 = prop2;
}
public Foo() {
this(new SimpleBooleanProperty(this, "prop1"), new SimpleStringProperty(this, "prop2"));
}
}
Foo foo = new Foo();
InvalidationListener l = o -> {
ReadOnlyProperty p = (ReadOnlyProperty) o;
System.out.println("changed property: " + p.getName());
Foo bean = (Foo) p.getBean();
System.out.println(bean.prop1.get());
System.out.println(bean.prop2.get());
};
foo.addListener(l);