Загрузка fxml в качестве фонового процесса - Javafx
Мой начальный fxml (скажемhome.fxml
) имеет много функций, поэтому для полной загрузки требуется много времени. Чтобы избежать разрыва во времени между запуском программы и загрузкой fxml, я ввел еще один fxml (скажем,loader.fxml
) с изображением GIF, которое должно отображаться во время загрузки основного файла fxml. Проблема в том, что изображение gif в моем loader.fxml не перемещается, так как в программе зависает, пока home.fxml не будет загружен полностью. Чтобы избежать этого, я переместил загрузку home.fxml в поток, как показано в коде ниже.
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);
}
}
Но после этого кода моя программа также зависает (изображение GIF не движется). Если я загружу fxml внеPlatform.runLater()
Я получаю исключениеNot on FX Thread
.
Я также устал использоватьTask()
но с этого изображение GIF движется, но FXML не загружается в фоновом режиме, если я пытаюсь загрузить FXML за пределамиPlatform.runLater()
.
Может кто-нибудь, пожалуйста, помогите мне и скажите мне, как я могу исправить код, чтобы мой fxml загружался в фоновом режиме, не нарушая процесс переднего плана.