首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定属性的更改侦听器仅接收对任务中messageProperty的最后更新

绑定属性的更改侦听器仅接收对任务中messageProperty的最后更新
EN

Stack Overflow用户
提问于 2020-04-14 20:32:17
回答 1查看 44关注 0票数 0

在我的JavaFX-11 fxml应用程序中,我有一个简单的测试任务:

代码语言:javascript
复制
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 message属性,并绑定了一个更改侦听器,用于在日志窗口中写入消息:

代码语言:javascript
复制
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());
});

我像这样开始这个线程:

代码语言:javascript
复制
Thread computationThread = new Thread(testTask);
computationThread.setDaemon(true);
computationThread.start();

控制台显示以下消息:

代码语言:javascript
复制
taskMessage change listener invoked, new value = 
taskMessage change listener invoked, new value = TestTask message after sleep 3

我知道“中间消息值可以合并以节省事件通知”,但这里我们只讨论4条消息,间隔1秒。它们几乎不能淹没事件队列,所以我不明白为什么绑定属性只更新两次:一次是空消息,第二次是最后一条消息。

EN

回答 1

Stack Overflow用户

发布于 2020-04-17 20:55:01

使用ChangeListener是正确的方法。当我开始编写lambda表达式时,集成开发环境建议了一个适用的侦听器列表,而我无意中接受了InvalidationListener的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61207757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档