【发布时间】:2020-11-26 18:25:54
【问题描述】:
我想在 JavaFX 中使用Popup 显示ProgressBar,这样我就可以通过调用PopUp 的hide() 方法使ProgressBar 消失。但是,当后台任务完成时,ProgessBar 并没有消失,而是根本不显示。
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage stage) {
StackPane root = new StackPane();
Popup popup = new Popup();
ProgressBar bar = new ProgressBar();
popup.getContent().add(bar);
Task<Void> task = new Task<>() {
@Override
protected Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
updateProgress(i, 100);
} catch (Exception ignored) {
}
}
return null;
}
};
bar.progressProperty().bind(task.progressProperty());
task.setOnSucceeded(workerStateEvent -> popup.hide());
popup.show(stage);
new Thread(task).start();
stage.setScene(new Scene(root, 100, 100));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果我使用root.getChildren().add(bar) 手动将ProgressBar 添加到Stage,则该栏正确显示,其progressProperty 正确绑定,所以我知道问题出在Popup。但是,使用该方法,后台任务完成后该栏不会消失。
【问题讨论】:
标签: java multithreading javafx popup progress-bar