fermer la fenêtre FXML par code, javafx

j'ai besoin de fermer le fxml par la fenêtre de code dans le contrôleur

je connais stage.close() ou sur scène.hide() le faire dans le fx

comment l'implémenter dans fxml? J'ai essayé

private void on_btnClose_clicked(ActionEvent actionEvent) {
        Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));    
        Scene scene = new Scene(root);

        Stage stage = new Stage();            
        stage.setScene(scene);
        stage.show();
}

mais ça ne fonctionne pas!

Toute aide sera grandement appréciée. Merci!

36
demandé sur pupeno 2012-11-26 18:36:40

7 réponses

  1. donnez à votre bouton de fermeture un fx: id, si vous n'avez pas encore: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. Dans votre classe de contrôleur:

    @FXML private javafx.scene.control.Button closeButton;
    
    @FXML
    private void closeButtonAction(){
        // get a handle to the stage
        Stage stage = (Stage) closeButton.getScene().getWindow();
        // do what you have to do
        stage.close();
    }
    
115
répondu Abdullah Battal 2012-11-28 09:55:25

Si vous avez une fenêtre qui s'étend javafx.application.Application; vous pouvez utiliser la méthode suivante.

Platform.exit();

Exemple:

public class MainGUI extends Application {
.........

Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........

public class ExitButtonListener implements EventHandler<ActionEvent> {

  @Override
  public void handle(ActionEvent arg0) {
    Platform.exit();
  }
}

Modifier pour la beauté de Java 8:

 public class MainGUI extends Application {
    .........

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
16
répondu codepleb 2016-05-05 20:34:45

j'ai implémenté ceci de la manière suivante après avoir reçu un NullPointerException à partir de la accepté de répondre.

Dans mon FXML:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">

Dans mon Controller catégorie:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}
7
répondu Austin D 2016-02-11 05:18:13

je ne sais pas si c'est la meilleure façon (ou si ça fonctionne), mais vous pourriez essayer:

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

        if (window instanceof Stage){
            ((Stage) window).close();
        }
}

(en supposant que votre contrôleur est un noeud. Sinon vous devez obtenir le noeud en premier (getScene () est une méthode de Noeud)

1
répondu Puce 2012-11-27 17:56:51

j'ai trouvé une solution sympa qui n'a pas besoin d'un événement déclenché:

@FXML
private Button cancelButton;

close(new Event(cancelButton, stage, null));

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}
1
répondu lolo 2016-04-25 09:42:05

vous pouvez simplement cela,

@FXML
private void closeAction(ActionEvent evt){
    System.exit(0);
}

va faire l'affaire pour vous.

0
répondu Oshan_Mendis 2017-10-29 13:19:09
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

C'est équivalent à hide. Donc, quand vous allez à l'ouvrir la prochaine fois, vous venez de vérifier si le stage l'objet est quitté ou non. Si elle est sortie, vous juste show() i.e. (stage.show()) appel. Sinon, vous avez pour commencer la scène.

0
répondu Om Prakash 2018-04-09 15:32:15