JavaFX setOnKeyReleased 与 textProperty 侦听器

JavaFX setOnKeyReleased vs textProperty listeners

我在 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”;

"2 1"第三次,

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

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

P.S.: 你实际上也不需要 AtomicInteger 在这里,因为听众正在 运行 上的 JavaFX UI 线程一个接一个。所以不能有任何并发​​更新(使用当前代码)。