2017-01-26 54 views
1

我有一个这样的控制器:绑定到对象的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); 
    } 
} 

正如你所看到的城市是最初分配给空,searchById其分配到一个新的价值,我想创建一个绑定到城市的属性时,它有一个有效的价值,但它不是然后将文本属性设置为空(也许解除绑定字段,但我不知道),并禁用字段,但我没有一个好主意做到这一点,提前感谢任何帮助。

+0

你的绑定,即使'city'不是空是行不通的:当你改变'城市“,文本字段仍然会绑定到旧城区的名称。您需要制作'city'和observable属性,并且可能使用[EasyBind](https://github.com/TomasMikula/EasyBind)或[ReactFX](https:// github)中的绑定功能等第三方绑定库的.com/TomasMikula/ReactFX)。 –

回答

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)); 
+0

我不是很了解flatMap,究竟是什么,但是,它的作用就像一个魅力,只是最后一个问题,怎么能创建一个像city.getCountry()。getName()这样的嵌套属性的绑定? – user2005494

+0

'Val.flatMap(city,City :: countryProperty).flatMap(Country :: nameProperty)。orElseConst(“”)'。 –

+0

谢谢,它解决了我的问题 – user2005494