【发布时间】:2021-05-11 21:31:35
【问题描述】:
我正在使用 CompletableFuture 运行长时间运行的操作。同时,我使用 SwingWorker 以 5 为增量更新进度条。
JProgressBar progressBar = new JProgressBar();
progressBar.setMinimum(0);
progressBar.setMaximum(100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
CompletableFuture<NetworkToolsTableModel> completableFuture = CompletableFuture.supplyAsync(() -> asyncTask());
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
int val = 0;
while (!completableFuture.isDone()) {
if (val < 100) {
val += 5;
progressBar.setValue(val);
}
Rectangle bounds = progressBar.getBounds(null);
progressBar.paintImmediately(bounds);
}
return null;
}
};
worker.execute();
在异步方法完成之前,进度条不会更新。我也尝试在 EDT 线程上执行此操作,但无济于事。您所看到的基本上是我在这一点上尝试进行反复试验。
为什么进度条没有更新?我该如何解决这个问题?
【问题讨论】:
-
使用
SwingWorker的重点是您publish将“更新”返回到事件调度队列,process安全地进行这些更改。你也不应该改变组件的大小
标签: java swing user-interface event-dispatch-thread jprogressbar