JavaFX setOnKeyReleased vs textProperty侦听器

JavaFX setOnKeyReleased vs textProperty侦听器,javafx,eventhandler,Javafx,Eventhandler,我在JavaFX中有一个名为search的文本字段。我想在用户更改其内容时运行代码。我使用了setOnKeyReleased事件处理程序,但它的行为很奇怪。鉴于此代码: search.setOnKeyReleased (e -> { AtomicInteger n = new AtomicInteger(); search.textProperty().addListener ((observableValue, oldValue, newValue) -> {

我在JavaFX中有一个名为search的文本字段。我想在用户更改其内容时运行代码。我使用了setOnKeyReleased事件处理程序,但它的行为很奇怪。鉴于此代码:

search.setOnKeyReleased (e -> {
   AtomicInteger n = new AtomicInteger();
   search.textProperty().addListener ((observableValue, oldValue, newValue) -> {
       n.set(n.get() + 1);
       System.out.println(n.get());
   });
});
控制台在我第一次释放搜索文本字段内的键时不打印任何内容

第二次“1”

"二, 1"第三次,

"三, 2. 1“第四次,依此类推。
我不明白它为什么会这样。您能解释一下吗?

您正在为每个KeyRelease事件添加新的KeyListener。每次键入任何内容时都会触发侦听器和按键释放。因此,“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());
});

另外,这里实际上不需要AtomicInteger,因为侦听器正在JavaFXUI线程上逐个运行。因此不能有任何concurrents更新(使用当前代码)。

我遵循了本教程:,但可能是错误的(第5分钟)@Dav,本教程作者也犯了类似的错误,但他的听众没有明显的效果。它们只是一次又一次地做同样的工作,但由于结果相似,所以您看不出问题所在。此处的
AtomicInteger
可能更多地用于修改lambda中的局部变量,而不是用于并发属性。