JavaFX 8图形线程管道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX 8图形线程管道相关的知识,希望对你有一定的参考价值。

我正在尝试添加一个加载对话框,在加载一些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图形有多线程管道?

答案

JavaFX图形有多线程管道?

不,必须在Platform线程上完成触及FX UI的所有内容(包含一些记录的异常)。

目前你在平台线程上直接调用startGraphic(),所以无论该方法在做什么,它都必须在平台线程上发生任何其他事情之前完成执行(包括更新你的加载对话框)。

这可能有点痛苦,但在UI工具包中很常见。围绕它的常规方法(假设startGraphic()进行了一系列UI初始化)将是从UI线程启动方法,然后将单个UI操作包装在Platform.runLater()中,而不是一次性包装整个事物。在平台线程上有许多小的可运行程序将允许它在两者之间安排UI的更新,包括对加载轮的更新。

以上是关于JavaFX 8图形线程管道的主要内容,如果未能解决你的问题,请参考以下文章

基于javafx如何用线程完成移动一个圆?

JavaFX窗口拖动

JavaFX自定义窗口标题栏

如何以毫秒为单位获取javaFX音频片段的长度[关闭]

在哪里可以找到 JDK 8/JavaFX 8 源代码? [关闭]

JavaFX 多线程之 TaskServiceScheduledService