我有一个像这样的 Controller :
public class ItemController {
@FXML TextField name;
@FXML TextField description;
private City city = null;
@FXML public void initialize () {
name.textProperty().bind(city.nameProperty());
description.textProperty().bind(city.descriptionProperty());
}
public void searchById(int idCity) {
//get a city by its id, it returns null if not found
city = Backend.getCity(idCity);
}
}
正如您所看到的,city 最初被分配为 null,并且 searchById 将其分配给一个新值,我想在 city 具有有效值时创建一个到 city 属性的绑定(bind),但随后不会将文本属性设置为空(也许解除字段绑定(bind),但我不确定)并禁用字段,但我不知道如何执行此操作,提前感谢您的帮助。
最佳答案
您不仅需要在名称
更改时更改绑定(bind),还需要在城市
更改时更改绑定(bind)。为了实现这一点,city
本身必须是可观察的。
// private City city = null;
private ObjectProperty<City> city = new SimpleObjectProperty<>();
现在您的文本字段必须绑定(bind)到“属性的属性”。标准库中对此有一些有限的 API,但它编写得不好,并且对 null 值的处理非常糟糕。我建议您使用第三方库来实现此类功能。 ReactFX内置了此功能,您可以这样做
@FXML public void initialize () {
name.textProperty().bind(Val.flatMap(city, City::nameProperty).orElseConst(""));
name.disableProperty().bind(city.isNull());
// ...
}
对于双向绑定(bind),您可以这样做
name.textProperty().bindBidirectional(Val.selectVar(city, City::nameProperty));
关于java - 绑定(bind)到对象的 javafx 属性(可以为 null),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883802/