在我的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 message属性,并绑定了一个更改侦听器,用于在日志窗口中写入消息:
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秒。它们几乎不能淹没事件队列,所以我不明白为什么绑定属性只更新两次:一次是空消息,第二次是最后一条消息。
发布于 2020-04-17 20:55:01
使用ChangeListener是正确的方法。当我开始编写lambda表达式时,集成开发环境建议了一个适用的侦听器列表,而我无意中接受了InvalidationListener的建议。
https://stackoverflow.com/questions/61207757
复制相似问题