JavaFX addListener 不工作

JavaFX addListener not working

我是 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 仍然显示默认文本 "Label",而不是“25”

你可以这样走:

 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+"");  
        });
    });

您可以简单地使用 bindings 来实现:

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

LabelkingRewardLabel会显示IntegerPropertykingBonus的值,只有显示的值大于零才可见。

但是,如果你想和听众在一起:

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

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

最后,回答你关于为什么监听器是 "not working" 的问题 - 可能有两个原因:

1)显示的Label不是kingRewardLabel

中存储的Label

2)当你调用kingBonus.setValue(25);时,kingBonus中存储的值已经是25,不会触发changed事件,因此监听器根本没有执行。