JavaFX 中的一次 ChangeListener

One shot ChangeListener in JavaFX

有没有办法让监听器触发一次并自行删除?

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

该代码无效。对于这个看似简单的问题,我只能想出复杂的解决方案。

如何使用匿名内部 class 而不是 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 class 中创建 myProperty 时,我使用完整的构造函数来指定 bean。 new SimpleLongProperty(this, "myProperty", 0l);

即使这样做你仍然不能使用 lambda 来删除 this