Ответ на вопрос
Причиной сбоя Task
является то, что вы создаете Stage
в потоке, отличном от потока приложения JavaFX.В Javadoc Stage
говорится:
Объекты Stage должны создаваться и изменяться в потоке приложений JavaFX.
Это означает, что при попытке создать Stage
в фоновом потоке, в котором запущен Task
, будет IllegalStateException
с сообщением о том, что вы не в потоке приложений JavaFX.Чтобы решить эту проблему, оберните весь код, который создает и / или изменяет Stage
в вызове Platform.runLater(Runnable)
.
Примечание: Вероятно, было бы лучше не создавать Stage
в Task
вообще.Скорее, в вашем случае просто верните результат FXMLLoader.load(URL)
и создайте Stage
при обработке успеха Task
.
Task<Parent> task = new Task<Parent>() {
@Override
protected Parent call() throws Exception {
return FXMLLoader.load(getClass().getResource("sample2.fxml"));
}
};
task.setOnSucceeded(event -> {
Parent root = task.getValue();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
};
Почему не отображается ошибка?
Вы говорите, что ошибки нет, но вы также не показываете код, который бы отображал ошибку, если она возникнет.При сбое Task
он устанавливает причину сбоя в свойстве exception
.Чтобы обработать случай сбоя Task
, вы можете:
- Прослушать свойство
exception
- Добавить
EventHandler
для обработки события WorkerStateEvent.WORKER_STATE_FAILED
и запроситьexception
свойство - Либо с использованием
task.setOnFailed(EventHandler)
или task.addEventXXX(EventType, EventHandler)
, где XXX
равно либо Filter
, либо Handler
- Переопределить метод
protected void failed()
в вашей реализации Task
и запросите свойство exception
- Метод
failed()
всегда будет вызываться в потоке приложений JavaFX
- Поймать и обработать исключениев методе
call()
перед повторным сбросом - Возможно, другие способы, о которых я сейчас не думаю