javafx - 绑定属性的更改侦听器仅接收到 Task 中 messageProperty 的最后一次更新
问题描述
在我的 JavaFX-11 fxml 应用程序中,我有一个简单的测试任务:
public class TestTask extends Task<Void> {
@Override
protected Void call() throws Exception {
updateMessage("TestTask message before sleep 1");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 1");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 2");
Thread.sleep(1000);
updateMessage("TestTask message after sleep 3");
return null;
}
}
在 fxml 控制器类中,我将一个属性绑定到 Task 消息属性,以及一个我想用来在日志窗口中写入消息的更改侦听器:
TestTask testTask = new TestTask();
SimpleStringProperty taskMessage = new SimpleStringProperty();
taskMessage.bind(testTask.messageProperty());
taskMessage.addListener(cl -> {
System.out.println("taskMessage change listener invoked, new value = " + taskMessage.getValue());
msgList.add(taskMessage.getValue());
});
我这样开始线程:
Thread computationThread = new Thread(testTask);
computationThread.setDaemon(true);
computationThread.start();
控制台显示以下消息:
taskMessage change listener invoked, new value =
taskMessage change listener invoked, new value = TestTask message after sleep 3
我知道“可以合并中间消息值以保存事件通知”,但这里我们只讨论 4 条消息,间隔 1 秒。他们几乎无法淹没事件队列,所以我不明白为什么绑定属性只更新两次:一次是空消息,第二次是最后一条消息。
解决方案
使用 aChangeListener
是正确的做法。当我开始编写 lambda 表达式时,IDE 建议了一个适用的侦听器列表,而我不小心接受了InvalidationListener
.
推荐阅读
- c++ - 如何以符合标准的方式方便地填充混合类型的缓冲区?
- reactjs - 在 React 中全屏拖放文件
- kubernetes-helm - helm-template 按键获取地图的值
- javascript - 如何使用多个 id 重构这种颜色变化
- asp.net-core - 托管在 IIS 上的 ASP.NET core 2.1 API
- xslt - XSL 2.0:使用 _ 将字符串格式化为 CamelCase
- unity3d - 从统一检查器中获取对动态实例化按钮的 OnClick 执行的函数的引用
- python-3.x - python 3.7 设置环境变量路径
- javascript - 光滑的旋转木马上的图像沿着鼠标拖动移动
- azure - Azure S2S 出站 NAT 转换