绑定到可以为null的对象的javafx属性

时间:2017-01-26 22:04:45

标签: java javafx

我有一个像这样的控制器:

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的属性,当它具有有效值时,但它不会设置文本属性要清空(也许是解开字段,但我不确定)并禁用字段,但我不知道该怎么做,提前感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您需要更改绑定,不仅name更改,而且city更改。要做到这一点,city本身必须是可观察的。

// private City city = null;
private ObjectProperty<City> city = new SimpleObjectProperty<>();

现在,您的文本字段必须绑定到“属性的属性”。标准库中存在一些有限的API,但编写得不好并且处理空值极其严重。我建议您使用第三方库来实现此类功能。 ReactFX内置了此功能,您可以

@FXML public void initialize () {
    name.textProperty().bind(Val.flatMap(city, City::nameProperty).orElseConst(""));
    name.disableProperty().bind(city.isNull());

    // ...
}

对于双向绑定,您可以

name.textProperty().bindBidirectional(Val.selectVar(city, City::nameProperty));