我创建了一个自定义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立即显示带有新货币符号的金额。
我已经了解到,使用Properties
和Binding
可以在没有任何额外方法的情况下更新另一个变量时更新一个变量。
现在,以更实际的方式,我希望如果我调用setCurrency("$")
方法,一个Rs2,000的字段将立即显示$ 2,000。
我怎样才能使用Properties和/或Binding或其他任何方式来解决这个问题?
答案 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
已被绑定。