【发布时间】:2018-06-03 04:01:22
【问题描述】:
我正在尝试添加在加载某些 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 图形有多线程管道吗?
【问题讨论】:
-
您在 FX 应用程序线程上明确运行
startGraphic。该方法在做什么?如果它没有改变实际显示的任何内容,则可以在后台线程中运行。
标签: java multithreading javafx netbeans netbeans-8