【问题标题】:Binding to javafx properties of a object that can be null绑定到可以为 null 的对象的 javafx 属性
【发布时间】:2017-01-26 22:04:45
【问题描述】:

我有一个这样的控制器:

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 的属性(也许取消绑定字段,但我不确定)并禁用字段,但我不知道该怎么做,提前感谢您的帮助。

【问题讨论】:

  • 即使city 不为空,您的绑定也不起作用:当您更改city 时,文本字段仍将绑定到旧城市的名称。您需要制作city 和可观察属性,并且可能使用第三方绑定库,例如EasyBindReactFX 中的绑定功能。

标签: java javafx


【解决方案1】:

您不仅需要在 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));

【讨论】:

  • 我不太了解 flatMap 到底是做什么的,但是是的,它就像一个魅力,只是最后一个问题,如何创建对像 city.getCountry() 这样的嵌套属性的绑定。获取名称()?
  • Val.flatMap(city, City::countryProperty).flatMap(Country::nameProperty).orElseConst("").
  • 什么是Val?它是一个类还是一个对象?它在哪里定义?我在 ReactFX 的 javadocs 中没有看到它
  • ReactFX 框架中的一个类。可能仅在最新的开发版本中。
猜你喜欢
  • 2013-05-11
  • 2017-07-12
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多