JavaFXTextFormatter退格问题

JavaFXTextFormatter退格问题,java,javafx,Java,Javafx,我正在使用javafx.scene.control.TextFormatter将textfield格式化为货币字段。下面是我的代码 private static final double DEFAULT_VALUE = 0.00d; private static final String CURRENCY_SYMBOL = "Rs"; // public static final DecimalFormat CURRENCY_DECIMAL_FORMAT =

我正在使用javafx.scene.control.TextFormatter将textfield格式化为货币字段。下面是我的代码

private static final double DEFAULT_VALUE = 0.00d;
private static final String CURRENCY_SYMBOL = "Rs"; //
public static final DecimalFormat CURRENCY_DECIMAL_FORMAT
        = new DecimalFormat(CURRENCY_SYMBOL + "###,##0.00");

public static TextFormatter<Double> currencyFormatter() {
    return new TextFormatter<Double>(new StringConverter<Double>() {
        @Override
        public String toString(Double value) {
            return CURRENCY_DECIMAL_FORMAT.format(value);
        }

        @Override
        public Double fromString(String string) {
            try {
                return CURRENCY_DECIMAL_FORMAT.parse(string).doubleValue();
            } catch (ParseException e) {
                return Double.NaN;
            }
        }
    }, DEFAULT_VALUE,
            change -> {
                try {
                    CURRENCY_DECIMAL_FORMAT.parse(change.getControlNewText());
                    return change;
                } catch (ParseException e) {
                    return null;
                }
            }
    );
}

//format textfield into a currency formatted field
text_field.setTextFormatter(SomeClass.currencyFormatter());
private静态最终双默认值=0.00d;
私有静态最终字符串CURRENCY_SYMBOL=“Rs”//
公共静态最终十进制格式货币\u十进制\u格式
=新的十进制格式(货币符号+“#####,##0.00”);
公共静态文本格式化程序currencyFormatter(){
返回新的TextFormatter(新的StringConverter(){
@凌驾
公共字符串toString(双值){
返回货币\十进制\格式。格式(值);
}
@凌驾
public Double fromString(字符串字符串){
试一试{
返回货币\十进制\格式.parse(string).doubleValue();
}捕获(解析异常){
返回Double.NaN;
}
}
},默认值,
更改->{
试一试{
CURRENCY_DECIMAL_FORMAT.parse(change.getControlNewText());
回报变化;
}捕获(解析异常){
返回null;
}
}
);
}
//将文本字段格式化为货币格式字段
text_field.setTextFormatter(SomeClass.currencyFormatter());
一切正常,只是我不能将整个文本字段退格

任何帮助都是值得的。谢谢大家!

来自:

筛选器本身是一个接受
TextFormatter.Change
对象的
UnaryOperator
。它应该返回一个
TextFormatter.Change
对象,该对象包含实际的(过滤的)更改返回null将拒绝更改。

如果文本没有数字,则无法对其进行分析,在这种情况下,您将返回null,这将导致拒绝键入更改

一个选项是简化TextFormatter:

return new TextFormatter<Number>(
    new NumberStringConverter(CURRENCY_DECIMAL_FORMAT));
返回新的文本格式化程序(
新的数字字符串转换器(货币\十进制\格式);
来自:

筛选器本身是一个接受
TextFormatter.Change
对象的
UnaryOperator
。它应该返回一个
TextFormatter.Change
对象,该对象包含实际的(过滤的)更改返回null将拒绝更改。

如果文本没有数字,则无法对其进行分析,在这种情况下,您将返回null,这将导致拒绝键入更改

一个选项是简化TextFormatter:

return new TextFormatter<Number>(
    new NumberStringConverter(CURRENCY_DECIMAL_FORMAT));
返回新的文本格式化程序(
新的数字字符串转换器(货币\十进制\格式);