[英]How to get reference to Property ChangeListener inside ChangeListener in JavaFX?
我想添加到属性侦听器,等待调用此侦听器并删除此侦听器。 所以我写了下面的代码:
ChangeListener<String> listener = (observable, oldValue, newValue) -> {
textField.setStyle("-fx-border-color:black");
textField.textProperty().removeListener(listener); //LINE X
};
textField.textProperty().addListener(listener);
但是,在LINE XI中, Variable listener might not have been initialized
。 如何在ChangeListener中引用属性ChangeListener来删除它?
从JLS, 第15.27.2节 :
与出现在匿名类声明中的代码不同,名称的含义以及出现在lambda主体中的this和super关键字以及引用声明的可访问性与周围上下文中的相同(除了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);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.