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));
Label
kingRewardLabel
会显示IntegerProperty
kingBonus
的值,只有显示的值大于零才可见。
但是,如果你想和听众在一起:
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事件,因此监听器根本没有执行。
我是 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));
Label
kingRewardLabel
会显示IntegerProperty
kingBonus
的值,只有显示的值大于零才可见。
但是,如果你想和听众在一起:
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事件,因此监听器根本没有执行。