JavaFX中的一次性ChangeListener

时间:2015-02-03 17:15:28

标签: javafx-8

有没有办法让听众一旦开火并自行移除?

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

该代码不起作用。我只能想到这个看似简单问题的复杂解决方案。

1 个答案:

答案 0 :(得分:1)

如何使用匿名内部类而不是lambda表达式?

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);
    }
};

注意,当我在Spec类中创建myProperty时,我使用完整的构造函数来指定bean。 new SimpleLongProperty(this, "myProperty", 0l);

即使这样做,您仍然无法使用lambda删除this