簡體   English   中英

如果它不是String屬性,是否可以將TextProperty綁定到ObjectProperty的String屬性?

[英]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)

在這兩種情況下, bindBidirectionalbind替換bindBidirectional ,但是我不能更改TextField的文本。 我意識到這是因為我將TextField的文本綁定到cityName的String。 因此,我想到了以一種相反的方向綁定它的方法,例如:

MapsManager.mapProperty().????.bind(cityNameTF.textProperty());

但是“ ????” -我沒有String的屬性,並且即使可能,我也不知道如何動態創建StringBindingStringProperty

如何在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM