2016-07-28 10 views
-1

終了ボタン(左上隅のx)をクリックするたびに、プログラムを終了するかどうかをユーザーに尋ねるポップアップを表示しようとしています。しかし、私はFXMLを使用していて、ポップアップをロードしようとすると例外をスローする必要がありますprimaryStage.setOnCloseRequest(new EventHandler<WindowEvent>{}私は呼び出し元のメソッドでエラーをスローしても未処理の例外エラーが発生します。私は試してみることを試みましたが、エラーは発生しませんが、コードは実行されません。私は現在、別のメソッドにラップすることができるかどうかを確認しようとしているので、例外を回避することはできますが、何も動作していないようです。 Exceptionが投げられたsetOnCloseRequestを使用する方法はありますか?例外は、機能インタフェースの抽象メソッドのthrows句の例外に割り当てられない場合ラムダ(または同等のもの)で例外をスローする - javafx

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

あなたは、ラムダ式/ anonymusクラスからchecked exceptionを投げることはできません。それが原因だと例外を持つ新しいチェックされない例外投げされて何ができるか

:起こっ

try{ 
    internalCloseProgram(); 
} catch (Exception e){ 
    throw new IllegalStateException("something went wrong", e); 
} 

しかし何もFinalExitMessage.fxmlをロードすることはできなかったことを示す指標であるように思われます。注:例外を単に「飲み込む」ことは、安全に無視でき、デバッグのための情報を必要としないことが分かっていない限り、良い考えではありません。


さらにonCloseRequestコールでイベントを消費することで、あなたは、ウィンドウを閉じるための試みを無視するのJavaFXを教えてください。あなたはそれを閉じたい場合には、あなたはまた、internalCloseProgram方法に示すStageから

Platform.exit(); 

を使用することができます

primaryStage.close(); 

を使用して、ステージを自分で閉じる必要があります。

また、新しいステージでshowの代わりにshowAndWaitを呼び出して、新しいステージが終了するまで待つこともできます。

追加の推奨:モダリティを使用して、新しいステージが表示されている間にイベントをプライマリステージにブロックします。ウィンドウが閉じられるべきか


次の例では、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(); 
} 
関連する問題