Вы добавляете новый 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 один за другим.Так что не может быть никаких параллельных обновлений (с текущим кодом).