JavaFX: используйте неопределенный индикатор выполнения на заставке - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть заставка:

splash screen Мне нужна анимация индикатора выполнения (неопределенная), но она не работает.

Возможно, это связано с тем, что мой поток запущен в моем методе инициализации.

public class splashscreenController implements Initializable {
  @Override
  public void initialize(URL location, ResourceBundle resources) {
    new SplashScreen().run();
  }

  class SplashScreen extends Task {
    @Override
    public Object call() {

        Platform.runLater(new Runnable() {
            @Override
            public void run()
                Parent root = null;
                try {
                    Thread.sleep(3000);
                    root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
                } catch (InterruptedException | IOException e) {
                    e.printStackTrace();
                }
                Stage stage = new Stage();
                stage.initStyle(StageStyle.UNDECORATED);

                assert root != null;
                Scene scene = new Scene(root, 1280, 720);
                stage.setScene(scene);
                stage.show();
                MainJavaFx.setPrimaryStage(stage);
                ((Stage) panParent.getScene().getWindow()).close();
            }
        });
        return null;
    }
  }
}

1 Ответ

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

В вашем коде 2 проблемы:

new SplashScreen().run();

A Task не обеспечивает функциональность для запуска в новом потоке. run выполняется в вызывающем потоке.

class SplashScreen extends Task {
    @Override
    public Object call() {

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                // placeholder for parts of your code
                longRunningOperation();
                guiUpdate();
            }
        });
        return null;
    }
}

Даже если вы выполняете эту задачу в отдельном потоке, Runnable, переданный Platfrom.runLater, выполняется в потоке приложения JavaFX, и выполнение длительных операций из этого запускаемого приложения останавливает графический интерфейс.

Вместо этого выполняйте все длительные операции в фоновом потоке и выполняйте только короткие обновления, используя Platfrom.runLater.

new Thread(new SplashScreen()).start();
class SplashScreen extends Task {
    @Override
    public Object call() throws IOException, InterruptedException {
        Thread.sleep(3000);
        final Parent root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                Stage stage = new Stage();
                stage.initStyle(StageStyle.UNDECORATED);

                Scene scene = new Scene(root, 1280, 720);
                stage.setScene(scene);
                stage.show();
                MainJavaFx.setPrimaryStage(stage);
                ((Stage) panParent.getScene().getWindow()).close();
            }
        });
        return null;
    }
}

Обратите внимание, что, поскольку вы не используете функциональность, предоставляемую Task, вы можете просто реализовать Runnable с вашим классом вместо наследования от Task.

...