У моего исходного файла fxml (скажем home.fxml
) есть много функциональных возможностей, поэтому для полной загрузки требуется много времени. Поэтому, чтобы избежать временного разрыва между запуском программы и загрузкой fxml, я ввел еще один fxml (скажем loader.fxml
) с изображением gif, которое должно появиться во время загрузки основного файла fxml. Проблема заключается в том, что изображение gif в моем loader.fxml не перемещается, так как в программе висит до тех пор, пока home.fxml не будет загружен полностью. Чтобы избежать этого, я переместил home.fxml загрузку в поток, как показано ниже.Загрузить fxml в качестве фонового процесса - Javafx
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 загружался в фоновом режиме, не нарушая процесс переднего плана.
Я уже пробовал 'Задача'. Это дало мне исключение «IllegalStateException: Not on FX application thread». Не могли бы вы рассказать мне, как я могу выполнить его в потоке приложения FX? Использование 'Platform.runLater' висит первым fxml. :( –
Убедитесь, что вы не создаете сцену или сцену в фоновом потоке. Они должны быть созданы в приложении приложения FX, как здесь, в примере кода. –
Я пробовал код, упомянутый выше. одно и то же исключение. –