JavaFX TextArea принимает отрицательные десятичные дроби - PullRequest
0 голосов
/ 05 февраля 2020

Я создаю пользовательскую TextArea, которая принимает отрицательные десятичные дроби, пока пользователь пишет.

Это то, что я нашел в Интернете для десятичной TextAreas

public DecimalTextField() {

    super();

    UnaryOperator<Change> filter = new UnaryOperator<TextFormatter.Change>() {

        @Override
        public TextFormatter.Change apply(TextFormatter.Change t) {

            if (t.isReplaced()) 
                if(t.getText().matches("[^0-9]"))
                    t.setText(t.getControlText().substring(t.getRangeStart(), t.getRangeEnd()));


            if (t.isAdded()) {
                if (t.getControlText().contains(".")) {
                    if (t.getText().matches("[^0-9]")) {
                        t.setText("");
                    }
                } else if (t.getText().matches("[^0-9.]")) {
                    t.setText("");
                }
            }

            return t;
        }
    };

    this.setTextFormatter(new TextFormatter<>(filter));

}

Теперь мне нужно принять «-» в начале, но я думаю, что это не так просто, как кажется.

1 Ответ

1 голос
/ 05 февраля 2020

Используя этот ответ , создайте пользовательский StringConverter<Double> и используйте его с UnaryOperator<TextFormatter.Change> для приема только двойных чисел:

NumberFormat numberFormat = NumberFormat.getNumberInstance(); // you can set a locale here
UnaryOperator<TextFormatter.Change> filter = change -> {
    String controlNewText = change.getControlNewText();
    if ("-".equals(controlNewText)) {
        return change;
    } else {
        try {
            numberFormat.parse(controlNewText);
            return change;
        } catch (ParseException | NullPointerException ignored) {
            return null;
        }
    }
};
StringConverter<Double> converter = new StringConverter<Double>() {
    @Override
    public Double fromString(String s) {
        try {
            return numberFormat.parse(s).doubleValue();
        } catch (ParseException ignored) {
            return 0.0;
        }
    }
    @Override
    public String toString(Double d) {
        return numberFormat.format(d);
    }
};
this.setTextFormatter(new TextFormatter<>(converter, 0.0, filter));

ОБНОВЛЕНИЕ : Ответ был обновлен для использования NumberFormat вместо регулярного выражения Pattern, чтобы избежать проблем, возникающих при использовании другого Locale.

...