如何在后台任务javaFX中捕获异常的对话框中显示错误消息?

How to display error message in dialog from catched exception in a background task javaFX?

我正在构建 javaFX 用户界面与 windows 之间的用户交互,我 运行 遇到了一个问题,我无法在任何地方找到解决方案...

所以基本上我想打开一个对话框,其中包含用户可以填写的输入,一旦完成,应用程序就会启动一个包含这些信息的后台任务,并在任务 运行 时显示另一个对话框(加载屏幕)。但 !在任务期间可能会发生错误并且可以捕获异常,如果它出现我想在另一个对话框中为用户显示异常消息。

所以,首先,我与输入对话:

// Init dialog
Dialog<String> inputDialog = new Dialog<>();
inputDialog.setTitle("Meshes generation parameters");
// Add validation buttons
inputDialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, 
ButtonType.CANCEL);
// Creating content
GridPane gridPane = new GridPane();
TextField width = new TextField("15000");
gridPane.add(new Label("Width (meters)"), 0, 0);
gridPane.add(width, 1, 0);
// Filling dialog
inputDialog.getDialogPane().setContent(gridPane);

// Returning result with OK button
inputDialog.setResultConverter(dialogButton -> {
        if (dialogButton == ButtonType.OK) {
            return width.getText();
        }
        return null;
    });

// Opens dialog until user close it or validate it.
Optional<String> result = inputDialog.showAndWait();

然后,如果结果被触发,我将创建一个任务:

result.ifPresent(width -> {
// Creates task that will run in background
Task task= new Task() {
    @Override
    protected Object call() throws Exception {
        try {
            // Do things with 'width'
        } catch (Exception e) {
            system.out.println("Exception catched in task !");
            // Tried to open dialog from here but it never shows
        }
        return null;
    }
}; // End of task

// Open 'loading screen' dialog until task ends
ProgressDialog dialog = new ProgressDialog(meshesGeneration);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Please wait.");
dialog.setHeaderText("This may take some time, please wait.");
dialog.initStyle(StageStyle.UTILITY);
// Runs the task
new Thread(task).start();
dialog.showAndWait();

});

一切都很好,ProgressDialog 显示直到任务完成,无论它是失败还是成功。我可以在控制台中显示异常已被捕获,但在捕获中创建的对话框从未显示。

我尝试了不同的方法,例如:

task.setOnFailed(e -> {
    system.out.println(task.getException().getMessage()); // Nothing
});

我还尝试在任务本身中添加状态或异常...

} catch (Exception e) {
    system.out.println("Exception caught in task !");
    failed();
    setException(e);
}

但我似乎什么也没发生...我什至得到一个 SUCCEEDED 状态,异常被捕获和一个用于搜索 task.getException() 的 nullPointerException(在 result.ifPresent{...)!

我在多线程方面很菜鸟...我错过了什么吗?任何帮助将不胜感激,谢谢 :)

尝试在 Platform.runLater

中显示它

假设您正确打开对话框,代码工作正常:

} catch (Exception e) {
    System.out.println("Exception caught in task!");
    Platform.runLater(() -> {
        Alert dialog = new Alert(AlertType.ERROR, "Error", ButtonType.OK);
        dialog.show();
    });
}

触发 onFailed 处理程序的异常的标准方法是退出 call 方法并出现异常:

} catch (Exception e) {
    System.out.println("Exception caught in task!");
    throw e;
}

您可以简单地删除 try-catch,而不是重新抛出异常,但这不再允许您将消息打印到任务内的控制台。

task.setOnFailed(evt -> {
    System.out.println(task.getException().getMessage());
    Alert dialog = new Alert(AlertType.ERROR, "Error", ButtonType.OK);
    dialog.show();
});