Swing - ленивое обновление - PullRequest
0 голосов
/ 25 июня 2019

Есть ли у Swing что-то похожее на режим изменения значения vaadin LAZY?

Как в «обновлять каждое изменение, но после небольшой задержки и отменять событие, когда значение снова изменяется до завершения события»?

У нас есть текстовое поле типа float, которое мы привязываем к свойству типа

binder.bindProperty(MY_FOO).converted(floatToString()).to(view.myFoo, ON_KEY_TYPED);

, где binder представляет собой PresentationModelBinder и

public static BindingConverter<Float, String> floatToString() {
    return BindingConverters.<Float, String>fromModelAs(BindingConverters::toString).andFromViewAs(BindingConverters::parseFloat);
}

static <T> String toString(T anyValue) {
    return (anyValue == null) ? null : anyValue.toString();
}

static <T> String toString(Float floatValue) {
    return (floatValue == null) ? null : String.format("%.2f", floatValue);
}

Допустим, вы хотите ввести 12

  • вы вводите 1
  • Swing немедленно заменяет его на 1.00 и устанавливает курсор обратно на начало поля
  • вы вводите 2
  • упс, вы установили 21

Но становится еще хуже ...

Допустим, вы хотите написать 1.2

  • вы вводите 1
  • Swing немедленно заменяет это значение на 1.00 и устанавливает курсор обратно на начало поля
  • вы вводите .
  • десятичные дроби (в этом приложении) определены, чтобы начинаться с цифр, точка не является числом, поэтому свинг стирает неверный ввод
  • вы вводите 2
  • упс, вы установили 2

Что плохо для пользователя, а не то, что я хочу.

Глядя на com.jgoodies.binding.binder.ValueModelBindingBuilder, я вижу только два варианта: ON_FOCUS_LOST - который не соответствует тому, что мы хотим - и ON_KEY_TYPED - который очень четко ТАКЖЕ не соответствует тому, что мы хотим.

Есть ли что-то (в Swing), которое обеспечило бы нам необходимую функциональность или мы должны реализовать свою собственную?

(И прежде чем вы спросите, ДА, мы собираемся избавиться от Swing через несколько месяцев.)

...