2015-02-03 3 views
0

Есть ли способ сделать пожар слушателя один раз и удалить себя?Один снимок ChangeListener в JavaFX

for(Spec spec : specs){ 
     spec.myProperty().addListener((obs,ov,nv) -> { 
      if (nv.longValue() > 0){ 
       //do whatever 
       spec.myProperty().removeListener(this); 
      } 
     }); 
    } 

Этот код не будет работать. Я могу думать только о сложных решениях этой, казалось бы, простой проблемы.

ответ

1

Как насчет использования анонимного внутреннего класса вместо выражения лямбда?

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.

+0

Я пробовал, но я думаю, мой вопрос не является полным. Я просматриваю объекты списка и должен делать одно, если изменяется определенное свойство. Вопрос заключается в том, как передать объектную ссылку на слушателя в вашем случае. Я постараюсь переписать вопрос лучше. – brian

+0

@brian Возможно, это что-то для вас: https://eckig.github.io/blog/2014/09/01/using-javafxs-properties/ (создайте единый экземпляр Listener и привяжите его ко всем элементам вашего списка) – eckig

+0

Doh !, Я так понимаю, это тот класс, в котором есть свойство? Это прекрасно, я никогда не использовал бобы. Хорошая благодарность. – brian

Смежные вопросы