JavaFX addListener无法正常工作

Gia*_*olo 2 java javafx listener

我是JavaFX上的新手,我需要以Label某种方式绑定a的visible属性,如果它表示的值达到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);
Run Code Online (Sandbox Code Playgroud)

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

DVa*_*rga 7

您可以使用简单的绑定来实现此目的:

kingRewardLabel.textProperty().bind(kingBonus.asString());
kingRewardLabel.visibleProperty().bind(kingBonus.greaterThan(0));
Run Code Online (Sandbox Code Playgroud)

Label kingRewardLabel将要显示的值IntegerProperty kingBonus,并且如果所显示的值大于零它才可见.

但是,如果你想留在听众:

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

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

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

1)Label,则显示未在其中的一个Label存储在kingRewardLabel

2)在您调用时kingBonus.setValue(25);,存储的值kingBonus已经是25,将不会触发更改的事件,因此根本不执行侦听器.