JavaFX и многопоточность - GIF не запускается - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь реализовать кнопку GUI, чтобы при нажатии она выполняла два действия - выполнение основного кода (2-3 секунды) и отображение gif-preloader.

Я использовал Task для этой цели, инициализируя и запуская его в методе setOnAction. Сама задача, в свою очередь, использует метод showGif () для запуска образа.

Отдельно они работают правильно - showGif () открывает GIF, Task отображает счетчик, работающий параллельно с основным кодом в консоли.

Но когда я ставлю showGif () в Задаче, метод не работает. Он достигает строки "pane.setCenter (hb);" и останавливается. Я думал, что у него не было достаточно времени для запуска GIF и добавил 5-секундную задержку к основному коду - это тоже не помогло.

Что я делаю не так?

Помимо Task, я также попробовал Platform.runLater (новый Runnable) - результат тот же.

Действие кнопки:

btn_find.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent event) {

            isStarted = true;

            task = new Task<Object>() {
                @Override protected Object call() throws Exception {
                    showGif();
                    return null;
                }
            };

            new Thread(task).start();

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }...

Метод Gif:

protected static void showGif() {
    System.out.println("opening GIF...");

    File file = new File("/Users/user/Desktop/cat-preloader.gif");

    String localUrl = null;
    try {
        localUrl = file.toURI().toURL().toString();

    } catch (Exception e) {
        e.printStackTrace();
    }


    Image image = new Image(localUrl, 200,200, false, true);
    ImageView imageView = new ImageView(image);

    hb = new HBox();

    hb.setStyle("-fx-background-color: lightgrey");
    hb.setOpacity(0.7);
    hb.getChildren().add(imageView);
    HBox.setMargin(imageView, new Insets(300, 100, 60, 200));
    BorderPane.setMargin(hb, new Insets(0, 0,600, 0));

    System.out.println("setting the pane");

    // here thread execution stops
    pane.setCenter(hb); 
    System.out.println("GIF started");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...