JavaFX addListener无法正常工作

时间:2016-06-22 08:46:10

标签: java javafx listener

我是JavaFX的新手,我需要绑定Label的可见属性,如果它所代表的值达到0,则Label应该是不可见的。此外,当有界integerProperty值更改时,需要更新它。

这是我的代码:

@FXML
private Label kingRewardLabel;

// many other stuff between

IntegerProperty kingBonus = mainApp.getLocalModel().getMap().kingBonus();

kingBonus.addListener((observable, oldValue, newValue) -> {
    if (newValue.equals(0)) {
        kingRewardLabel.setVisible(false);
    } else {
        kingRewardLabel.setText(String.valueOf(newValue.intValue()));
    }
});

// testing the listener 
kingBonus.setValue(25);

我已经尝试调试一点但是一切看起来都很好,没有错误,没有异常抛出,只是监听器不起作用,或者至少没有像我期望的那样,因为Label仍然显示默认文本“标签”,而不是“25”

2 个答案:

答案 0 :(得分:7)

您只需使用bindings即可实现此目的:

kingRewardLabel.textProperty().bind(kingBonus.asString());
kingRewardLabel.visibleProperty().bind(kingBonus.greaterThan(0));

Label kingRewardLabel会显示IntegerProperty kingBonus的值,只有在显示的值大于零时才会显示。

但是,如果你想与听众保持联系:

kingBonus.addListener((obs, oldVal, newVal) -> {
    kingRewardLabel.setVisible(newVal.intValue() > 0);
    kingRewardLabel.setText(newVal.toString());
});

这与问题中的听众几乎相同,但在这种情况下,如果Label变得不可见,则永远不会再次显示,因为永远不会调用kingRewardLabel.setVisible(true)

最后,回答你的问题,为什么听众是"不工作" - 可能有两个原因:

1) Label,其中显示的不是Label中存储的kingRewardLabel

2)当您调用kingBonus.setValue(25);时,kingBonus中存储的值已经为25,不会触发更改的事件,因此不会执行侦听器一点都不。

答案 1 :(得分:0)

你可以这样:

 kingBonus.addListener(l -> {
            int value = kingBonus.getValue().intValue();
            System.out.println("Entered listener for value:" + value);
            if (value == 0)
                kingRewardLabel.setVisible(false);
            else
                kingRewardLabel.setText(value+"");  
        });
    });