Я пытаюсь реализовать кнопку 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");
}