我是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”
答案 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+"");
});
});