JavaFX setOnKeyReleased与textProperty侦听器

时间:2018-10-05 13:27:31

标签: javafx eventhandler

我在JavaFX中有一个名为search的textField。我想在用户更改其内容时运行代码。我使用了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英寸,依此类推。 我不知道为什么会这样。你能给个解释吗?

1 个答案:

答案 0 :(得分:2)

您将在每个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线程上一个接一个地运行。因此,不会有任何并发​​更新(使用当前代码)。