我试图让弹出窗口询问用户是否希望每次单击退出按钮(左上角的x)时退出程序。但是,当我尝试使用primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>{}
加载弹出窗口时,我正在使用FXML并且必须抛出异常。即使在我调用的方法中抛出错误,我仍然会收到未处理的异常错误。我试过尝试捕获,虽然没有错误代码不运行。我目前正在尝试看看我是否可以将该方法包装在另一个中,以便我可以绕过异常,但似乎没有任何工作。有没有办法使用setOnCloseRequest
抛出Exception
?
public class Main extends Application {
@Override
public void start(Stage primaryStage)throws Exception {
File f = new File("Goal.txt");
boolean bool = false;
if (f.exists() )
{
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainPage.fxml"));
Parent root = loader.load();
primaryStage.setTitle("Money Saver Program");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
else
{
bool = f.createNewFile();
Parent root = FXMLLoader.load(getClass().getResource("OpeningPage.fxml"));
primaryStage.setTitle("Money Saver Program");
primaryStage.setScene(new Scene(root, 638, 400));
primaryStage.show();
}
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent event) {
event.consume();
closeProgram();
}
});
}
public static void main(String[] args) throws Exception {
launch(args);
}
public void closeProgram(){
try{internalCloseProgram();}catch (Exception e){}
}
public void internalCloseProgram()throws Exception{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FinalExitMessage.fxml"));
Parent root = fxmlLoader.load();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.setTitle("Money Saver Program");
stage.show();
}
}
答案 0 :(得分:1)
如果异常不能分配给功能接口的抽象方法的throws
子句中的异常,则不能从lambda表达式/匿名类中抛出checked exception。
可以做的是抛出一个新的未经检查的异常,因为它的原因有异常:
try{
internalCloseProgram();
} catch (Exception e){
throw new IllegalStateException("something went wrong", e);
}
然而,没有任何事情似乎表明加载FinalExitMessage.fxml
失败了。注意:简单地“吞下”异常并不是一个好主意,除非您确定可以安全地忽略它并且您不需要调试信息。
此外,通过在onCloseRequest
调用中使用事件,您可以告诉JavaFX忽略关闭窗口的尝试。您需要自己关闭舞台,以防您想要使用
primaryStage.close();
您也可以使用
Platform.exit();
来自Stage
方法中显示的internalCloseProgram
。
此外,您可以通过在新舞台上调用showAndWait
而不是show
来等待用户与新舞台互动,以等待新舞台关闭。
其他建议:在显示新阶段时,使用模态将事件阻止到主要阶段。
以下示例询问是否应使用Alert
关闭窗口。 showAndWait
Alert
方法与Stage.showAndWait
不同:返回Optional<ButtonType>
返回用户选择。对于Stage
,您需要访问控制器才能获得结果。
@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new Group(), 100, 100);
primaryStage.setOnCloseRequest(evt -> {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Do you really want to close this applicetion?", ButtonType.YES, ButtonType.NO);
ButtonType result = alert.showAndWait().orElse(ButtonType.NO);
if (ButtonType.NO.equals(result)) {
// no choice or no clicked -> don't close
evt.consume();
}
});
primaryStage.setScene(scene);
primaryStage.show();
}