在lambda(或等效的)中抛出异常 - javafx

时间:2016-07-28 08:20:23

标签: java javafx lambda fxml

我试图让弹出窗口询问用户是否希望每次单击退出按钮(左上角的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();
    }

}

1 个答案:

答案 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();
}