2016-06-15 12 views
2

私はポップアップとして新たなステージを開きコントローラがあります。JavaFXのウィンドウ内の「x」ボタン

@FXML 
private void onClickPayments(ActionEvent event) throws IOException{ 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ClientPayments.fxml")); 
    Parent root = (Parent) loader.load(); 
    ClientPaymentsController controller = (ClientPaymentsController) loader.getController(); 
    Scene scene = new Scene(root); 
    Stage stage = new Stage(); 
    stage.setScene(scene); 
    stage.initModality(Modality.APPLICATION_MODAL); 

    stage.setResizable(false); 
    stage.setOnCloseRequest((WindowEvent we) -> { 
     clientBLL.retrieve(clientID); 
     updateWarning(); 
    }); 

    stage.show(); 
    controller.setClientID(clientID); 
} 

他のステージは 'で閉じられていますx 'ボタンを押すと、' stage.setOnCloseRequest 'が実行されます。しかし、その段階で、私は閉じるためのボタンがあります。

@FXML 
private void onClickExit(ActionEvent event){ 
    ((Stage) ((Node) event.getSource()).getScene().getWindow()).close(); 
} 

それは閉じますが、方法「stage.setOnCloseRequestは」実行されていません。

この方法は間違っていますか、ウィンドウの「x」ボタンとまったく同じように動作するようにポップアップを閉じる方法はありますか?

答えて

4

外部ウィンドウを閉じる要求(つまりコードからのものではない)があるときにハンドラが実行されます。 documentationを参照してください。

それは、ウィンドウが閉じられた直後に後にそのロジックを実行するのに十分だ場合は、だけではなく、通常のonHiddenハンドラを使用:あなたは本当にあなたが望む可能性があるため、onCloseRequestハンドラ(例えばを使用する必要がある場合

stage.setOnHidden((WindowEvent we) -> { 
    clientBLL.retrieve(clientID); 
    updateWarning(); 
}); 

をcloseを拒否するには)、closeロジックをメソッドに移動し、両方のタイプのリクエストから呼び出してウィンドウを閉じます。

public void doClose() { 
    clientBLL.retrieve(clientID); 
    updateWarning(); 
} 

@FXML 
private void onClickExit(ActionEvent event){ 
    doClose(); 
    ((Node) event.getSource()).getScene().getWindow().hide(); 
} 

stage.setOnCloseRequest((WindowEvent we) -> { 
    controller.doClose(); 
}); 
関連する問題