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
。
有没有办法让监听器触发一次并自行删除?
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
。