gpt4 book ai didi

java - JavaFX 8图形线程管道

转载 作者:行者123 更新时间:2023-12-03 13:08:37 25 4
gpt4 key购买 nike

我正在尝试添加一些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图形有多线程管道吗?

最佳答案

There is a multithreading pipeline for JavaFX graphics?



不,涉及FX UI的所有操作(有一些已记录的异常(exception)情况)都必须在Platform线程上完成。

目前,您正在平台线程上直接调用 startGraphic(),因此无论该方法在做什么,它都必须先完成执行,然后其他任何事情才能在平台线程上发生(包括更新加载对话框)。

这可能会有些麻烦,但是在UI工具箱中很常见。解决该问题的正常方法(假设 startGraphic()进行了一堆UI初始化)是从UI线程启动该方法,然后将单个UI操作包装在 Platform.runLater()中,而不是一次性包装整个东西。平台线程上有许多小的可运行对象,这将使其能够安排介于两者之间的UI更新,包括对加载轮的更新。

关于java - JavaFX 8图形线程管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908642/

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