Я смотрел на этот вопрос JavaFX показать диалог после выполнения задачи потока , но мой вопрос вроде как противоположный. Каков наилучший способ срезать ветвь после выбора файла или оповещения, когда вам нужны данные от пользователя?
Вот что у меня сейчас:
Platform.runLater(()->{
File file = fileChooser.showOpenDialog(root.getScene().getWindow());
if(file == null) {
return;
}
executorService.execute(()->{
//more code here which uses file
});
});
где executorService - это ExecutorService, который был сделан ранее. Я полагаю, что я мог бы так же легко использовать Задачу, Поток или что-то еще, но не имеет значения, как это связано, просто то, что это занимает некоторое время, и я не хочу, чтобы это происходило в потоке Приложения, потому что это заблокирует пользовательский интерфейс.
Я знаю, что это не mvce, но я надеюсь, что это демонстрирует проблему, с которой я сталкиваюсь с потоками внутри Platform.runLater
вызовов.
Вот крайний пример того, насколько запутанными становятся такие вещи
@FXML
public void copyFiles(ActionEvent event){
//this method is on the application thread because a button or something started it
// so we thread off here
executorService.execute(()->{
// do some stuff
// ...
// get location to copy to from user
// must happen on the application thread!
Platform.runLater(()->{
File file = fileChooser.showOpenDialog(root.getScene().getWindow());
if(file == null) {
return;
}
executorService.execute(()->{
// more code here which uses file
// ...
// oh wait, some files have the same names!
// we need a user's confirmation before proceeding
Platform.runLater(()->{
Alert alert = new Alert(AlertType.CONFIRMATION, "Do you want to overwrite files with the same names?", ButtonType.OK, ButtonType.CANCEL);
Optional<ButtonType> choice = alert.showAndWait();
if(choice.isPresent && choice.get == ButtonType.OK){
// do something, but not on the application thread
executorService.execute(()->{
// do the last of the copying
// ...
});
}
});
});
});
});
}