JavaFX中的AnchorPane侦听器

时间:2018-02-04 16:44:59

标签: java javafx javafx-8

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

1 个答案:

答案 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());
    });
}