Java属性绑定

时间:2017-09-06 09:52:51

标签: java javafx binding

我创建了一个自定义TextField(通过扩展javafx.scene.control.TextField),我用它来存储货币值,例如$ 120,000。我已调用此类CurrencyField,它有两个构造函数public CurrencyField()public CurrencyField(String currency)我还有public void setCurrency(String currency)方法来设置货币符号。可以使用new CurrencyField(currency)正确设置货币,或者稍后使用设置方法设置货币 - setCurrency(currency)

通常,我希望能够根据条件使用不同的货币符号(在这些问题的范围之外)例如。我可能想通过点击按钮将货币从$切换到£。在这种情况下,我希望所有CurrencyFields立即显示带有新货币符号的金额。

我已经了解到,使用PropertiesBinding可以在没有任何额外方法的情况下更新另一个变量时更新一个变量。 现在,以更实际的方式,我希望如果我调用setCurrency("$")方法,一个Rs2,000的字段将立即显示$ 2,000。

我怎样才能使用Properties和/或Binding或其他任何方式来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的CurrencyField类可能有两个属性:“amount”(DoubleProperty)和“currency”(StringProperty)。如果在您的情况下“double”不足以存储货币值,您还可以使用“ObjectProperty”或类似的东西。

然后基于这两个属性创建自定义绑定,以计算格式化字符串。此自定义绑定现在可以绑定到TextField的textProperty

这可能看起来像这样(未经测试):

public CurrencyField extends TextField {
    private StringProperty currency = new SimpleStringProperty();
    private DoubleProperty amount = new SimpleDoubleProperty(0);

    public CurrencyField() {
        // this observable will be updated everytime either "currency" or "amount" is updated.
        ObservableStringValue formattedAmount = 
            Bindings.createStringBinding(() -> {
                String currencyValue = currency.get();
                double amountValue = amount.get();
                return currencyValue + " " + amountValue; // your formatting logic here
            }, currency, amount);

        this.textProperty().bind(formattedAmount);
    }

    // getter/setter/property-accessors

}

此解决方案需要记住两件事:

    你班上的
  • textProperty不能再从外面设置了。如果有人试图设置一个值,那么将抛出一个异常,表明textProperty已被绑定。
  • 也许“formattedAmount”可能会收集垃圾。如果是这种情况,您只需在类中为formattedAmount创建一个字段。初始化仍然可以在构造函数中发生。