我在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英寸,依此类推。 我不知道为什么会这样。你能给个解释吗?
答案 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线程上一个接一个地运行。因此,不会有任何并发更新(使用当前代码)。