必须在 GUI 线程的繁重工作期间显示 ProgressIndicator
Show ProgressIndicator during heavy work in GUI thread has to be done
是否有可能在 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 绑定到它显示的列表的大小,如下所示:
几周前做过,工作过,忘记了。
这会花费很多时间。因此,尽管在设置绑定时对调用进行计时并没有表明它需要花费很多时间,但是当表变大时,ui 线程似乎有一个很大的问题。
感谢 james,他的回答对于大多数 运行 这类问题的人来说都是正确的。
有人可以在那边评论这个问题吗:
(因为这是第一个问题,我没有足够的代表。尚未发表评论)
在启动任务时加载 Task
, running in a background thread. Display the loading animation (or 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();
是否有可能在 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 绑定到它显示的列表的大小,如下所示:
这会花费很多时间。因此,尽管在设置绑定时对调用进行计时并没有表明它需要花费很多时间,但是当表变大时,ui 线程似乎有一个很大的问题。
感谢 james,他的回答对于大多数 运行 这类问题的人来说都是正确的。
有人可以在那边评论这个问题吗:
在启动任务时加载 Task
, running in a background thread. Display the loading animation (or 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();