Lade fxml als Hintergrundprozess - Javafx

Meine anfängliche fxml (sagen Siehome.fxml) hat viele Funktionen, daher dauert das vollständige Laden viel Zeit. Um die Zeitlücke zwischen dem Programmstart und dem Laden der Dateien zu vermeiden, habe ich eine weitere Datei hinzugefügt (sayloader.fxml) mit einem GIF-Bild, das erscheinen soll, während die Haupt-FX-Datei geladen wird. Das Problem ist, dass sich das GIF-Bild in meiner loader.fxml nicht bewegt, da das Programm hängt, bis die home.fxml vollständig geladen ist. Um dies zu vermeiden, habe ich das Laden der Datei home.fxml in einen Thread verschoben, wie im folgenden Code gezeigt.

public class UATReportGeneration extends Application {

    private static Stage mainStage;

    @Override
    public void start(Stage stage) {
        Parent loaderRoot = null;
        try {
            loaderRoot = FXMLLoader.load(getClass().getResource("/uatreportgeneration/fxml/Loader.fxml"));
        } catch (IOException ex) {
            Logger.getLogger(UATReportGeneration.class.getName()).log(Level.SEVERE, null, ex);
        }
        Scene loadScene = new Scene(loaderRoot);
        stage.setScene(loadScene);
        stage.initStyle(StageStyle.UNDECORATED);
        stage.getIcons().add(new Image(this.getClass().getResourceAsStream("/uatreportgeneration/Images/logo.png")));

        stage.show();


        mainStage = new Stage(StageStyle.UNDECORATED);
        mainStage.setTitle("Upgrade Analysis");
        mainStage.getIcons().add(new Image(this.getClass().getResourceAsStream("/uatreportgeneration/Images/logo.png")));
        setStage(mainStage);

        new Thread(() -> {
            Platform.runLater(() -> {
                try {
                    FXMLLoader loader = new FXMLLoader();
                    Parent root = loader.load(getClass().getResource("/uatreportgeneration/fxml/Home.fxml"));

                    Scene scene = new Scene(root);
                    mainStage.setScene(scene);
                    mainStage.show();
                    stage.hide();
                    System.out.println("Stage showing");
                    // Get current screen of the stage
                    ObservableList<Screen> screens = Screen.getScreensForRectangle(new Rectangle2D(mainStage.getX(), mainStage.getY(), mainStage.getWidth(), mainStage.getHeight()));
                    // Change stage properties
                    Rectangle2D bounds = screens.get(0).getVisualBounds();
                    mainStage.setX(bounds.getMinX());
                    mainStage.setY(bounds.getMinY());
                    mainStage.setWidth(bounds.getWidth());
                    mainStage.setHeight(bounds.getHeight());
                    System.out.println("thread complete");
                } catch (IOException ex) {
                    Logger.getLogger(UATReportGeneration.class.getName()).log(Level.SEVERE, null, ex);
                }

            });
        }).start();

    }

    public static Stage getStage() {
        return mainStage;
    }

    public static void setStage(Stage stage) {
        mainStage = stage;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        launch(args);
    }

}

Aber nach diesem Code hängt auch mein Programm (Das GIF-Bild bewegt sich nicht). Wenn ich die fxml außerhalb des @ laPlatform.runLater(), Ich bekomme die AusnahmeNot on FX Thread.

Ich bin auch müde mitTask() aber davon bewegt sich das GIF-Bild, aber die Fxml wird nicht im Hintergrund geladen, wenn ich versuche, die Fxml außerhalb von @ zu ladPlatform.runLater().

Kann mir bitte jemand helfen und mir sagen, wie ich den Code korrigieren kann, damit meine fxml im Hintergrund geladen wird, ohne den Vordergrundprozess zu stören.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage