2017-01-26 4 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» и наблюдаемое свойство и, возможно, использовать стороннюю библиотеку привязки, такую ​​как [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, но он плохо написан и очень редко обрабатывает значения null. Я рекомендую вам использовать стороннюю библиотеку для такого рода функций. 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 (город, город :: countryProperty) .flatMap (Страна :: nameProperty) .orElseConst (" ")'. –

+0

Спасибо, он решил мою проблему – user2005494

Смежные вопросы