我想在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!");
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,标签在任务完成之前不会更新,只是显示之前的任何内容,直到analyze()方法返回.
如何强制更新标签,以便在开头显示"分析",然后"分析完成!" 任务完成后?
假设您analyze()在FX应用程序线程上调用您的方法(例如在事件处理程序中),您的耗时代码会阻止该线程并阻止UI更新,直到完成为止.正如@ glen3b在评论中所说,您需要使用外部线程来管理此代码.
JavaFX提供了一个Task API来帮助您完成此任务.特别是,它提供了为您调用Java FX Application线程上的代码的方法,允许您从后台安全地更新UI Task.
所以你可以做点什么
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();
}
Run Code Online (Sandbox Code Playgroud)
如果你需要StringProperty在任务完成时解除绑定,你可以这样做
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
labelString.unbind();
}
});
Run Code Online (Sandbox Code Playgroud)