2017-09-06 152 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