web-dev-qa-db-ja.com

JavaFXでステージの終了イベントを取得するにはどうすればよいですか?

JavaFXで、ユーザーがステージを閉じるボタン(X)(一番上の一番上の十字)をクリックした場合にイベントを取得するにはどうすればよいですか?

アプリケーションがウィンドウを閉じたときにデバッグメッセージを出力したい。 (System.out.println("Application Close by click to Close Button(X)")

@Override
   public void start(Stage primaryStage) {
        StackPane root = new StackPane();
       root.getChildren().add(btn);
       Scene scene = new Scene(root, 300, 250);
       primaryStage.setTitle("Hello World!");
       primaryStage.setScene(scene);
       primaryStage.show();

       // Any Event Handler
       //{
       System.out.println("Application(primaryStage) Closed by click to Close Button(X)");
       //}
   }
15
java baba

私はこの質問の答えを得ました

stage.setOnHiding(new EventHandler<WindowEvent>() {

         @Override
         public void handle(WindowEvent event) {
             Platform.runLater(new Runnable() {

                 @Override
                 public void run() {
                     System.out.println("Application Closed by click to Close Button(X)");
                     System.exit(0);
                 }
             });
         }
     });
15
java baba

同じ効果を実現するもう1つの方法ですが、アプリケーションの起動方法との整合性は、stop()をオーバーライドすることで維持できます。

JavaFXドキュメントによると、アプリケーションのインスタンスのライフサイクルは次のとおりです。

JavaFXランタイムは、アプリケーションが起動されるたびに、次のことを順番に実行します。

  1. 指定されたApplicationクラスのインスタンスを構築します
  2. Init()メソッドを呼び出します
  3. Start(javafx.stage.Stage)メソッドを呼び出します
  4. アプリケーションが完了するのを待ちます。これは、次のいずれかが発生したときに発生します。
    • アプリケーションがPlatform.exit()を呼び出す
    • 最後のウィンドウが閉じられ、PlatformのimplicitExit属性がtrueである
  5. Stop()メソッドを呼び出します

結果として、単にstop()をオーバーライドします

@Override
public void stop(){
    System.out.println("Stage is closing");
}
10
wayway
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
      public void handle(WindowEvent we) {
          System.out.println("Stage is closing");
      }
  }); 
6
Sijo Jose