web-dev-qa-db-fra.com

ferme la fenêtre fxml par code, javafx

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

Je sais que stage.close () ou stage.hide () le font en FX

comment implémenter cela en 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 marche pas!

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

39
alfredo138923
  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();
    }
    
124
Abdullah Battal

Si vous avez une fenêtre qui étend javafx.application.Application;, vous pouvez utiliser la méthode suivante: ..__ (Cela fermera toute l’application, pas seulement la fenêtre. J’ai mal interprété le PO, merci aux commentateurs de l’avoir signalé.

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

Edit pour la beauté de Java 8:

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

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
18
codepleb

J'ai implémenté ceci de la manière suivante après avoir reçu une NullPointerException de la réponse acceptée.

Dans mon FXML:

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

Dans ma classe Controller:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}
8
Austin D

J'ai trouvé une solution de Nice qui ne nécessite pas qu'un événement soit 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
lolo

Je ne suis pas sûr que ce soit la meilleure façon (ou si cela fonctionne), mais vous pouvez 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 soit un nœud. Sinon, vous devez d'abord obtenir le nœud (getScene () est une méthode de Node).

1
Puce
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

Cela équivaut à hide. Ainsi, lorsque vous l'ouvrirez la prochaine fois, il vous suffira de vérifier si l'objet stage est quitté ou non. S'il est quitté, vous venez de show() c'est-à-dire (stage.show()) appeler. Sinon, vous devez commencer la scène.

0
Om Prakash