编程语言
首页 > 编程语言> > JavaFX 2 StringProperty在封闭方法返回之前不会更新字段

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