我正在尝试添加一个加载对话框,该对话框在一些javafx图形加载时显示。问题是javafx图形的加载阻塞了加载对话框的刷新。
这是我的代码:
Stage dialogStage;
ProgressBar pb = new ProgressBar();
ProgressIndicator pin = new ProgressIndicator();
dialogStage = new Stage();
dialogStage.initStyle(StageStyle.UTILITY);
dialogStage.setResizable(false);
dialogStage.initModality(Modality.APPLICATION_MODAL);
// PROGRESS BAR
final Label label = new Label();
label.setText("alerto");
pb.setProgress(-1F);
pin.setProgress(-1F);
final HBox hb = new HBox();
hb.setSpacing(5);
hb.setAlignment(Pos.CENTER);
hb.getChildren().addAll(pb, pin);
Scene scene = new Scene(hb);
dialogStage.setScene(scene);
final Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "START CALL" + ANSI_RESET);
for (int i = 0; i < 1; i++) {
System.out.println(ANSI_CYAN + "\tWAIT " + (i + 1) + "s;" + ANSI_RESET);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(FXMLDesktopController.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(ANSI_CYAN + "\tWAITED " + (i + 1) + "s;" + ANSI_RESET);
}
Platform.runLater(() -> {
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "FIRE APP" + ANSI_RESET);
startGraphic(anchorDesktop);
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "APP FIRED" + ANSI_RESET);
});
for (int i = 0; i < 0; i++) {
System.out.println(ANSI_CYAN + "\tWAIT " + (i + 1) + "s;" + ANSI_RESET);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(FXMLDesktopController.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(ANSI_CYAN + "\tWAITED " + (i + 1) + "s;" + ANSI_RESET);
}
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "END CALL" + ANSI_RESET);
return null;
}
};
pb.progressProperty().bind(task.progressProperty());
pin.progressProperty().bind(task.progressProperty());
dialogStage.show();
task.setOnSucceeded(event -> {
dialogStage.close();
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "CLOSE" + ANSI_RESET);
});
Platform.runLater(() -> {
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "START SHOW" + ANSI_RESET);
});
System.out.println(ANSI_CYAN + ANSI_RED_BACKGROUND + "NEW THEAD" + ANSI_RESET);
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();当调用startGraphic(anchorDesktop)时,会阻止进度条的动画,直到加载完所有图形。是否有用于JavaFX图形的多线程管道?
发布于 2017-12-20 23:19:05
是否有用于JavaFX图形的多线程管道?
不,所有涉及FX UI的东西(有几个文档记录的例外)都必须在平台线程上完成。
目前,您正在平台线程上直接调用startGraphic(),因此无论该方法做什么,它都必须在平台线程上发生任何其他事情之前完成执行(包括更新加载对话框)。
这可能有点麻烦,但在UI工具包中是很常见的。绕过它的正常方法(假设startGraphic()做了一大堆UI初始化)是从UI线程启动方法,然后在Platform.runLater()中包装单个UI操作,而不是一次性完成整个操作。在平台线程上有许多小的可运行程序将允许它在两者之间安排对UI的更新,包括对加载轮的更新。
https://stackoverflow.com/questions/47908642
复制相似问题