JavaFX 中的 AnchorPane 侦听器

AnchorPane listener in JavaFX

我正在尝试在 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");
            }
        });

正如James_D提到的,我认为这就是他所解释的

我尝试了很多东西并让它开始工作,方法是将 BooleanBinding 存储在控制器中并向存储的绑定添加一个更改监听器,这让我认为 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());
    });
}