JavaFX setOnKeyReleased vs textProperty слушатели - PullRequest
0 голосов
/ 05 октября 2018

У меня есть textField с именем поиска в JavaFX.Я хочу запустить код, когда пользователь меняет его содержимое.Я использовал обработчик события setOnKeyReleased, но он ведет себя странно.Учитывая этот код:

search.setOnKeyReleased (e -> {
   AtomicInteger n = new AtomicInteger();
   search.textProperty().addListener ((observableValue, oldValue, newValue) -> {
       n.set(n.get() + 1);
       System.out.println(n.get());
   });
});

Консоль ничего не печатает при первом отпускании ключа внутри поиска textField;

"1" во второй раз;

"2 1" в третий раз,

"3 2 1" в четвертый раз и т. Д.Я не могу понять, почему он так себя ведет.Можете ли вы дать объяснение?

1 Ответ

0 голосов
/ 05 октября 2018

Вы добавляете новый KeyListener на каждое событие KeyRelease.И слушатели, и KeyRelease запускаются каждый раз, когда вы что-либо печатаете.Таким образом, строка «3 2 1» является выводом от 3 разных слушателей до textProperty.

Если вы хотите отслеживать изменения содержимого, вам вообще не нужно событие KeyRelease, просто

AtomicInteger n = new AtomicInteger();
search.textProperty().addListener ((observableValue, oldValue, newValue) -> {
   n.set(n.get() + 1);
   System.out.println(n.get());
});

PS: вам также не нужен AtomicInteger, поскольку слушатели запускаются в потоке пользовательского интерфейса JavaFX один за другим.Так что не может быть никаких параллельных обновлений (с текущим кодом).

...