首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX 8图形线程管道

JavaFX 8图形线程管道
EN

Stack Overflow用户
提问于 2017-12-20 22:49:46
回答 1查看 175关注 0票数 2

我正在尝试添加一个加载对话框,该对话框在一些javafx图形加载时显示。问题是javafx图形的加载阻塞了加载对话框的刷新。

这是我的代码:

代码语言:javascript
复制
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图形的多线程管道?

EN

回答 1

Stack Overflow用户

发布于 2017-12-20 23:19:05

是否有用于JavaFX图形的多线程管道?

不,所有涉及FX UI的东西(有几个文档记录的例外)都必须在平台线程上完成。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47908642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档