gpt4 book ai didi

java - 在 GUI 线程中完成繁重工作时显示 ProgressIndicator

转载 作者:行者123 更新时间:2023-12-01 08:54:19 28 4
gpt4 key购买 nike

当 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 绑定(bind)到其显示的列表的大小,如下所示:JavaFX - Adapt TableView height to number of rows几周前做的,工作了,忘记了。

这会花费很多时间。因此,尽管在设置绑定(bind)时对调用进行计时并没有显示出它需要花费很多时间,但当表变大时,UI 线程似乎会遇到很大的问题。

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

有人可以评论一下这个问题吗:JavaFX - Adapt TableView height to number of rows(因为这是第一个问题,我没有足够的代表来发表评论)

最佳答案

将数据加载到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();

关于java - 在 GUI 线程中完成繁重工作时显示 ProgressIndicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42162058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com