我正在尝试在JavaFX中添加一个带有条件 的侦听器 ,但我的侦听器永远不会被触发。
@FXML
private AnchorPane inputRoot;
// Listener 1 - This works!
inputRoot.widthProperty().addListener(e -> {
if(inputRoot.getWidth() < 600) {
System.out.println("Root is smaller than 600");
} else {
System.out.println("Root is greater than 600");
}
});
// Listener 2 - This does not work!
inputRoot.widthProperty().greaterThan(600).addListener((obs, oldValue, newValue) -> {
if (!newValue) {
System.out.println("> Root is greater than 600");
} else {
System.out.println("> Root is smaller than 600");
}
});
如上所述 - 我需要 Listener 2 才能工作,以便在满足条件时执行。没有错误 - 没有任何反应。
任何澄清都是巨大的。谢谢
更新 根据James_D的解释 - 保持对绑定的引用可以解决问题。
private BooleanBinding widthProperty = inputRoot.widthProperty().greaterThan(600);
widthProperty.addListener((obs, oldValue, newValue) -> {
if (!newValue) {
System.out.println("> Root is greater than 600");
} else {
System.out.println("> Root is smaller than 600");
}
});
答案 0 :(得分:0)
正如James_D所说,我认为这是他解释的内容
我尝试了很多东西并且让它工作,通过在Controller中存储BooleanBinding并向存储的绑定添加一个changelistener,这让我觉得James_D对垃圾收集问题是正确的
@FXML
private AnchorPane inputRoot;
private BooleanBinding gt600;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
gt600 = inputRoot.widthProperty().greaterThan(600);
gt600.addListener((observable, newvalue, oldvalue) -> {
System.out.println(newvalue.toString());
});
}