为什么要在此代码中的javafx主线程上使用Platform.runlater?

时间:2019-01-09 03:04:19

标签: java multithreading javafx

我正在使用小型机器在JavaFx ui中创建Java应用程序。我想显示加载页面,并在进度指示器进行期间加载数据文件。

我知道如果我在加载fxml文件和控制器的代码上添加Platform.runlater可以很好地工作,但是在javaFx主应用程序线程上使用Platform.runlater很奇怪。我检查了线程的名称,但它们是相同的。如果使用注释单独运行,它也可以工作。

我为什么需要使用Platform.runlater?

如果我不添加,加载图像会变成白屏并跳过图像,仅显示菜单视图。

//处理

// 1。设置加载页面图片

// 2。加载数据文件

// 3。加载下一页(菜单)

public void loadHomeMenuPage() {
    setLoadingImage();
    execLoadingData();
    execLoadingView(this);
}

private void setLoadingImage() {
    System.out.println("Load -> " + Thread.currentThread());

    File file = new File("Resources/images/load.png");
    InputStream is;

    try 
    {
        is = new FileInputStream(file);
        this.logoImageView.setImage(new Image(is));
    }
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }   
}

private void execLoadingData() {

    // load openCv files
    new LoadOpenCV();

    // load protocol files
    new ProtocolLoader().load();

    // load language pack here

}

private void execLoadingView(IController loadController) {

    //Load homeMenu after loading all data
    //Platform.runLater(() -> {
                System.out.println(Thread.currentThread());

                IController controller = (IController) FxmlUtils.LOAD
                        .fxmlPath(PathFxml.ABS_PATH_HOME_MENU_VIEW)
                        .pane("BorderPane")
                        .set2BaseBorderPane(this.baseBorderPane, "center")
                        .exec();

                controller.setBaseBorderPane(this.baseBorderPane);

    //});
}

0 个答案:

没有答案