[英]Is it possible to bind a TextProperty to an ObjectProperty's String attribute if it is not a String property?
如何在不使用ChangeListener
情況下將ObjectProperty
的屬性(本身不是屬性)綁定到其他一些屬性,例如TextField
的text屬性?
進一步來說:
我想使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()));
根據mapProperty的String屬性創建一個字符串屬性。
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
替換bindBidirectional
,但是我不能更改TextField
的文本。 我意識到這是因為我將TextField
的文本綁定到cityName
的String。 因此,我想到了以一種相反的方向綁定它的方法,例如:
MapsManager.mapProperty().????.bind(cityNameTF.textProperty());
但是“ ????” -我沒有String的屬性,並且即使可能,我也不知道如何動態創建StringBinding
或StringProperty
。
如何在ObjectProperty
的屬性和另一個StringProperty
之間手動創建String綁定?
您的MapDTO
基本上是JavaBean-帶有字段以及其getter和setter的類。 我們將這樣的字段稱為bean屬性 。 由於您不能綁定到這些屬性或從這些屬性綁定,因此JavaFX提供了將它們橋接到JavaFX屬性的適配器。 它們位於包javafx.beans.property.adapter中 :
提供各種類,充當常規Java Bean屬性和相應的JavaFX屬性之間的適配器。
在內部,它們充當bean屬性的包裝器。
由於您的MapDTO
包含String
我們將使用JavaBeanStringProperty 。 注意:
至少,Java Bean類必須為該屬性實現getter和setter。 該類以及getter和setter方法必須聲明為public。
因此我們遵守要求。
在這種情況下,我們使用其構建器JavaBeanStringPropertyBuilder創建這些適配器:
JavaBeanStringProperty cityNameProperty = JavaBeanStringPropertyBuilder.create()
.bean(MapsManager.getMap())
.name("cityName")
.build();
建設者以反射方式訪問數據。 現在,我們可以照常使用創建的屬性:
cityNameProperty.bind(cityNameTF.textProperty());
並且對文本字段的text
屬性cityName
的更改將更改MapDTO
實例中的MapDTO
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.