java - 绑定(bind)到对象的 javafx 属性(可以为 null)

标签 java javafx

我有一个像这样的 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/

相关文章:

java - 使用 Twilio 的 REST API

java - 简单的 JavaFX HelloWorld 不起作用

Java Servlet 命令行处理

java - JSF 应用程序的 Websphere 单点登录

JavaFX 和 JPA2 无法编译

由于 "GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline",JavaFX 程序未启动

java - 需要使用 JavaFX 在 HBox 中对图像进行动画处理的帮助

java - 在单个 hbox 中为 2 个元素提供单独的对齐方式

java - 如何使用 java/android 从 Firebase ONCE 读取数据?

java - 如何在 Spring 测试中创建嵌入式 Kafka 时修复 'Invalid URL'