Экран-заставка во время инициализации приложения - PullRequest
0 голосов
/ 22 октября 2018

Мое приложение занимает около 3-5 секунд для запуска.Я хотел бы предоставить обратную связь пользователю во время ожидания, с заставкой.Может кто-нибудь подсказать мне, как реализовать заставку во время инициализации приложения?

Мое приложение состоит в основном из tabPane с несколькими цифрами tabs.Каждая вкладка имеет свой собственный контроллер и FXML.

Я пробовал preloader, но это не работает для моего случая, или я не уверен, как настроить его, чтобы он работал.Большинство источников в сети использовали «таймер», но это просто не имеет никакого смысла.

Загрузка FXML:

22 октября 2018 года 1:54:56PM javafx.fxml.FXMLLoader $ ValueElement processValue ПРЕДУПРЕЖДЕНИЕ. Загрузка документа FXML с JavaFX API версии 8.0.171 в среде исполнения JavaFX версии 8.0.71

22 октября 2018 года 13:54:56 PM javafx.fxml.FXMLLoader $ ValueElement processValue ПРЕДУПРЕЖДЕНИЕ: загрузка документа FXML с API JavaFX версии 8.0.171 в среде выполнения JavaFX версии 8.0.71

22 октября 2018 13:54:56 javafx.fxml.FXMLLoader $ ValueElement processValue ПРЕДУПРЕЖДЕНИЕ: Загрузка документа FXML с API JavaFX версии 8.0.171 с помощью среды выполнения JavaFX версии 8.0.71

22 октября 2018 13:54:56 javafx.fxml.FXMLLoader $ ValueElement processValue ПРЕДУПРЕЖДЕНИЕ: загрузка документа FXML с помощьюJavaFX API версии 8.0.171 от JavaFX среды выполнения версии 8.0.71

22 октября 2018 г. 13:54:56 javafx.fxml.FXMLLoader $ ValueElement processValue ПРЕДУПРЕЖДЕНИЕ: загрузка документа FXML с JavaFXAPI версии 8.0.171 от JavaFX среды выполнения версии 8.0.71

1 Ответ

0 голосов
/ 21 ноября 2018

1 - создайте свой экран-заставку fxml

2 - в основном свяжите экран-заставку, как здесь:

@Override
public void start(Stage primaryStage) throws Exception{

    setPrimaryStage(primaryStage);
    prStage = primaryStage;
    Parent root = FXMLLoader.load(getClass().getResource("../gui/SplashScreen.fxml"));
    Scene scene = new Scene(root);
    prStage.setScene(scene);
    prStage.show();
}

3 - в SplashScreenControler вам нужно сделать две вещи:

  1. сделать ваше действие
  2. загрузить экран вашего приложения

, поэтому вам нужно создать класс Task внутри вашего контроллера, какэто:

public class splashscreenController implements Initializable {
    @FXML
    Pane panParent;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        new Thread(new SplashScreen()).start();
    }

    class SplashScreen extends Task {
        @Override
        public Object call() throws IOException, InterruptedException{
            //make something (here thrad.sleep)
            Thread.sleep(3000);
            Parent root = FXMLLoader.load(getClass().getResource("your/javafx/gui.fxml"));

            //need to be done after the initialized methode
            Platform.runLater(new Runnable() {
                @Override
                public void run()
                    Stage stage = new Stage();
                    assert root != null;
                    Scene scene = new Scene(root);
                    stage.setScene(scene);
                    //show your principal windows
                    stage.
                    MainJavaFx.setPrimaryStage(stage);

                    //close your splashScreen
                  ((Stage) panParent.getScene().getWindow()).close();
                }
            }
        });
        return null;
    }
}

Если вам нужна дополнительная информация, здесь есть очень хорошее видео по теме здесь

...