Как насчет использования анонимного внутреннего класса вместо выражения лямбда?
IntegerProperty property = new SimpleIntegerProperty();
InvalidationListener listener = new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
//TODO do something
property.removeListener(this);
}
};
property.addListener(listener);
Ответ был частично включен в комментарии, поэтому я добавлю свое решение [brian].
public void someMethod(){
for(Spec spec : specs){
spec.myProperty().addListener(listener);
}
}
ChangeListener<Number> listener = new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> obs, Number ov, Number nv) {
Spec spec = (Spec)((SimpleLongProperty)obs).getBean();
spec.myProperty().removeListener(this);
}
};
Обратите внимание, когда я создаю MyProperty в классе Spec я использую полный конструктор для указания боба. new SimpleLongProperty(this, "myProperty", 0l);
Даже делая это, вы все еще не можете использовать лямбда для удаления this
.
Я пробовал, но я думаю, мой вопрос не является полным. Я просматриваю объекты списка и должен делать одно, если изменяется определенное свойство. Вопрос заключается в том, как передать объектную ссылку на слушателя в вашем случае. Я постараюсь переписать вопрос лучше. – brian
@brian Возможно, это что-то для вас: https://eckig.github.io/blog/2014/09/01/using-javafxs-properties/ (создайте единый экземпляр Listener и привяжите его ко всем элементам вашего списка) – eckig
Doh !, Я так понимаю, это тот класс, в котором есть свойство? Это прекрасно, я никогда не использовал бобы. Хорошая благодарность. – brian