我想要添加到属性侦听器,等待何时将调用此侦听器并删除此侦听器。因此,我编写了以下代码:
ChangeListener<String> listener = (observable, oldValue, newValue) -> {
textField.setStyle("-fx-border-color:black");
textField.textProperty().removeListener(listener); //LINE X
};
textField.textProperty().addListener(listener);但是,在X行,我得到了Variable listener might not have been initialized。如何获得对属性ChangeListener在ChangeListener中的引用来删除它?
发布于 2017-08-24 17:42:32
来自JLS,第15.27.2款
与出现在匿名类声明中的代码不同,名字的含义以及出现在lambda主体中的this和超级关键字,以及引用声明的可访问性,都与周围的上下文相同(除了lambda参数引入新的名称外)。 ..。 实际上,lambda表达式需要讨论自己(或者递归地调用自己或调用其其他方法)是不寻常的,而使用名称来引用封闭类中本来会被隐藏的事物(this,toString())则更常见。如果有必要让lambda表达式引用自身(就像通过它引用),则应该使用方法引用或匿名内部类。。
(我的重点。)
因此,简单地说,lambda表达式不可能引用它自己。您需要将其重构为匿名内部类:
ChangeListener<String> listener = new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
textField.setStyle("-fx-border-color:black");
textField.textProperty().removeListener(this);
}
};
textField.textProperty().addListener(listener);当然,此时您可能不再需要引用了:
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
textField.setStyle("-fx-border-color:black");
textField.textProperty().removeListener(this);
}
});https://stackoverflow.com/questions/45867545
复制相似问题