2017-09-06 178 views
0

我已经创建了一个自定义的TextField(通过扩展javafx.scene.control.TextField),我使用它来存储货币值,例如$ 120,000。我叫这个类CurrencyField和它有两个构造函数public CurrencyField()public CurrencyField(String currency)我也有一个public void setCurrency(String currency)设置货币符号的方法。人们可以通过使用new CurrencyField(currency)出正确地设置货币或更高版本使用的setter方法设置 - setCurrency(currency)Java属性绑定

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

我已经知道,使用PropertiesBinding可以用来更新一个变量,当另一个变量更新没有任何额外的方法。 现在,以更实用的方式,我希望如果我拨打setCurrency("$")方法,具有Rs2,000的字段将立即显示$ 2,000。

我怎样才能使用属性和/或绑定或基本上任何其他方式?

+1

我认为这可以帮助你:https://stackoverflow.com/questions/35093145/string-with-numbers-and-letters-to-double-javafx – Sunflame

+0

假设你使用'TextField'的' text'属性来显示数字和货币符号,恐怕这是不可能的,因为任何'text'属性的绑定都会使'TextField'不可用(绑定属性不能设置)。您需要替换所有文本字段的货币符号而无需绑定。如果货币存储在一个属性中,你可以从一个监听器完成。 – fabian

+0

不相关:不需要继承textField,而是使用TextFormatter配置textField。除此之外:我不太了解这个问题 - 你到底在徘徊什么?并且改变货币肯定会改变价值......请提供一个SSCCE来证明你在做什么以及你如何达不到它 – kleopatra

回答

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创建一个字段。初始化仍然可以在构造函数中发生。
+0

请不要重新发明轮子...内核对格式化有广泛的支持(像Format等核心类)并将它们应用于具有TextFormatter属性的fx TextField – kleopatra