Как связать атрибут ObjectProperty
(который сам по себе не является свойством) с каким-либо другим свойством, таким как текстовое свойство TextField
, без использования ChangeListener
?
Более конкретно:
Я бы хотел TextField
изменить атрибут ObjectProperty
.
Пример кода:
MapDTO:
public class MapDTO {
private String cityName;
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
}
MapsManager:
public class MapsManager {
private static ObjectProperty<MapDTO> map = new SimpleObjectProperty<>();
public static MapDTO getMap() {
return map.get();
}
public static ObjectProperty<MapDTO> mapProperty() {
return map;
}
public static void setMap(MapDTO map) {
MapsManager.map.set(map);
}
}
BindingTestController:
public class BindingTestController {
private TextField cityNameTF = new TextField();
private void initialize() {
// Bind the cityName label to the selected MapsManager mapProperty's cityName
cityNameTF.textProperty().bind(Bindings.createStringBinding(
() -> MapsManager.mapProperty().getValue() == null ? null :
MapsManager.mapProperty().getValue().getCityName(),
MapsManager.mapProperty()));
}
}
Я пробовал:
Создание строкового свойства из выбранного значения атрибута String, но оно не сработало, и я не смог найти правильный путь.
cityNameTF.textProperty().bindBidirectional(Bindings.createStringBinding(
() -> selectMapCB.getValue() == null ? null : selectMapCB.getValue().getCityName(),
selectMapCB.valueProperty()));
Создание строкового свойства из атрибута String mapProperty.
cityNameTF.textProperty().bindBidirectional(Bindings.createStringBinding(
() -> MapsManager.getMapProperty().getValue() == null ? null : MapsManager.mapProperty().getValue().getCityName(),
MapsManager.mapProperty()));
Обе опции дают одинаковую ошибку:
bindBidirectional (javafx.beans.property.Property<java.lang.String>)
in StringProperty cannot be applied to (javafx.beans.binding.StringBinding)
В обоих случаях замена bindBidirectional
на bind
работает, но тогда я не могу изменить текст в TextField
.
Я понял, что это потому, что я связываю текст TextField
со строкой cityName
. Поэтому я подумал о том, чтобы связать его одним способом, но в противоположном направлении, что-то вроде:
MapsManager.mapProperty().????.bind(cityNameTF.textProperty());
Но "????" - У меня нет свойства для String, и я не знаю, как создать StringBinding
или StringProperty
на лету, если это вообще возможно.
Как вручную создать привязку String между атрибутом ObjectProperty
и другим StringProperty
?