2015-09-19 3 views
1

У меня есть два двойных свойства price1 и price2. Я знаю, что я могу связать его с этикеткой, как это:javafx: Как я могу форматировать свойство double для привязки?

Locale locale = new Locale("en", "UK"); 
    fxLabel.textProperty().bind(Bindings.format("price1/price2: %.3f/%.3f",.price1Property(),price2Property())); 

но отображаемое число не имеет запятые разделители (т.е. 123456,789 показан вместо 123,456.789). В идеале я хотел бы сделать что-то вроде следующего:

String pattern = "###,###.###;-###,###.###"; 
    DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(locale); 
    df.applyPattern(pattern); 
    df.setMinimumFractionDigits(3); 
    df.setMaximumFractionDigits(10); 
    // bind df.format(value from price1 and price 2 property) to the label 

Но я понятия не имею, как это сделать на имущество. Как я могу это решить?

ответ

6

Использование JavaFX высокого уровня связывания API, вы можете изменить формат строки и передать локаль Binding.format:

Locale locale = new Locale("en", "UK"); 
fxLabel.textProperty().bind(Bindings.format(locale, "price1/price2: %,.3f/%,.3f", price1Property(), price2Property())); 

В этом примере «» флаг используется в строке формата (все варианты и возможности задокументированы в java.util.Formatter API doc

Вы также можете использовать низкий уровень связывания API:.

StringBinding stringBinding = new StringBinding() { 

    private final static Locale LOCALE = new Locale("en", "UK"); 
    private final static DecimalFormat DF; 

    static { 
     String pattern = "###,###.###;-###,###.###"; 
     DF = (DecimalFormat) NumberFormat.getNumberInstance(LOCALE); 
     DF.applyPattern(pattern); 
     DF.setMinimumFractionDigits(3); 
     DF.setMaximumFractionDigits(10); 
    } 

    public StringBinding() { 
     super.bind(price1Property(), price2Property()); 
    } 

    @Override 
    protected String computeValue() { 
     return "price1/price2 " + DF.format(price1Property().get()) + "/" + DF.format(price2Property().get()); 
    } 
}; 
fxLabel.bind(stringBinding); 
Смежные вопросы