如何在后台任务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{...)!
我在多线程方面很菜鸟...我错过了什么吗?任何帮助将不胜感激,谢谢 :)
中显示它
假设您正确打开对话框,代码工作正常:
} 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();
});
我正在构建 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{...)!
我在多线程方面很菜鸟...我错过了什么吗?任何帮助将不胜感激,谢谢 :)
假设您正确打开对话框,代码工作正常:
} 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();
});