JavaFX 2 StringProperty在封闭方法返回之前不会更新字段
作者:互联网
我想在JavaFX应用程序中更新Label,以使文本随着方法运行而多次更改:
private void analyze(){
labelString.setValue("Analyzing"); // (labelString is bound to the Label during initialization)
// <Some time consuming task here>
labelString.setValue("Analysis complete!");
}
但是,当我运行此命令时,标签不会更新,直到任务完成为止,而仅显示之前的内容,直到analyzer()方法返回为止.
如何强制更新标签,以使其在开头显示“ Analyzing”(分析),然后显示“ Analysis complete!”(分析完成!).任务何时完成?
解决方法:
假设您正在FX Application Thread(例如在事件处理程序中)上调用analytics()方法,那么您耗时的代码将阻塞该线程并阻止UI更新直到完成.正如@ glen3b在评论中所说,您需要使用一个外部线程来管理此代码.
JavaFX提供了一个Task API,可帮助您完成此操作.特别是,它为您提供了在Java FX Application线程上调用代码的方法,使您可以从后台Task安全地更新UI.
所以你可以做类似的事情
private void analyze() {
Task<Void> task = new Task<Void>() {
public Void call() {
updateMessage("Analyzing");
// time consuming task here
updateMessage("Analysis complete");
}
};
labelString.bind(task.messageProperty());
new Thread(task).start();
}
如果您需要在任务完成时解除StringProperty的绑定,则可以执行
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
labelString.unbind();
}
});
标签:java,javafx-2 来源: https://codeday.me/bug/20191009/1879260.html