JavaFX 2 StringProperty在封闭方法返回之前不会更新字段

uut*_*uut 1 java javafx-2

我想在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()方法返回.

如何强制更新标签,以便在开头显示"分析",然后"分析完成!" 任务完成后?

Jam*_*s_D 5

假设您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)