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 线程一个接一个。所以不能有任何并发更新(使用当前代码)。
我在 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 线程一个接一个。所以不能有任何并发更新(使用当前代码)。