在GUI线程繁重的工作中显示ProgressIndicator必须完成

时间:2017-02-10 14:42:09

标签: java javafx ui-thread progress-indicator

是否有可能在javafx ui线程中完成一些繁重的工作时显示(旋转,未卡住)进度指示器?

背景故事: 我必须将一个相当大的tableView加载到TitledPane(需要几秒钟)。使整个事情滞后的命令是TitledPane.setContent(myTableView)。 所以我想在此期间至少显示一些加载动画或指示器。

所以现在我正在做以下事情,给ui线程留出足够的空间来展示我的加载动画,然后再进行昂贵的调用:

showMyLoadingAnimation();
PauseTransition pause = new PauseTransition(Duration.seconds(1));
pause.setOnFinished(event -> {
    setContent(myTableView);
});
pause.play();
dismissMyLoadingAnimation();

这样可以显示进度指示器,但是一旦ui线程开始处理setContent就会卡住它。

我见过一些人使用swing来显示停留或动画对话,只是为了让它在不同的线程中运行而不会卡住,但还是找不到令人信服的解决方案。

编辑: 好的,我发现了问题的根源。 所以我已经将表prefHeightProperty绑定到其显示的列表大小,如下所示:JavaFX - Adapt TableView height to number of rows 那几周前做过,工作过,忘了它。

需要花费很多时间。因此,虽然在设置绑定时对调用进行计时并不表示需要花费很多时间,但是当表变大时,ui线程似乎存在很大的问题。

感谢詹姆斯,对于遇到这类问题的大多数人来说,他的回答是正确的。

有人可以在那里评论此问题:JavaFX - Adapt TableView height to number of rows (因为这是第一个问题,我没有足够的代表,还没有评论)

1 个答案:

答案 0 :(得分:1)

将数据加载到后台线程中运行的Task中。启动任务时显示加载动画(或ProgressIndicator等),并在任务完成时将其删除。

基本理念如下:

TableView<MyDataType> table = new TableView<>();
// set up columns...

Task<List<MyDataType>> loadDataTask = new Task<List<MyDataType>>() {
    @Override
    protected List<MyDataType> call() throws Exception {
        List<MyDataType> data = ... ;
        // load data and populate list ...
        return data ;
    }
};
loadDataTask.setOnSucceeded(e -> table.getItems().setAll(loadDataTask.getValue()));
loadDataTask.setOnFailed(e -> { /* handle errors... */ });

ProgressIndicator progressIndicator = new ProgressIndicator();
table.setPlaceHolder(progressIndicator);

Thread loadDataThread = new Thread(loadDataTask);
loadDataThread.start();