JavaFX: двунаправленное связывание с NumberConverter - PullRequest
0 голосов
/ 07 мая 2018

Учтите это:

final TextField tfNum = new TextField();
final IntegerProperty intProp = new SimpleIntegerProperty();

Bindings.bindBidirectional(tfNum.textProperty(), intProp,
    new javafx.util.converter.NumberStringConverter());

Когда пользователь вводит -1, привязка вызывает исключение, когда пользователь вводит первый символ -. Есть ли способ заставить NumberStringConverter справиться с этим изящно?

1 Ответ

0 голосов
/ 07 мая 2018

Не совсем. Вы можете использовать пользовательский конвертер, который просто выводит значение по умолчанию, если синтаксический анализ завершается неудачно:

TextField tf = new TextField();
StringConverter<Number> converter = new StringConverter<Number>() {

    @Override
    public String toString(Number object) {
        return object == null ? "" : object.toString();
    }

    @Override
    public Number fromString(String string) {
        if (string == null) {
            return 0;
        } else {
            try {
                return Integer.parseInt(string);
            } catch (NumberFormatException ex) {
                return 0;
            }
        }
    }

};
IntegerProperty property = new SimpleIntegerProperty();
Bindings.bindBidirectional(tf.textProperty(), property, converter);

В качестве альтернативы используйте TextFormatter, который фиксирует только на Введите и потерю фокуса и автоматически устанавливает значение по умолчанию, если не удается проанализировать строку:

TextField tf = new TextField();
StringConverter<Number> converter = new NumberStringConverter();

TextFormatter<Number> formatter = new TextFormatter<>(converter, 0);
tf.setTextFormatter(formatter);

IntegerProperty property = new SimpleIntegerProperty();
property.bindBidirectional(formatter.valueProperty());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...