2012-11-26 3 views
31

je dois fermer la fenêtre FXML actuelle par le code dans le contrôleurfermer la fenêtre de FXML par code, JavaFX

Je sais stage.close() ou stage.hide() le font dans 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 cela ne fonctionne pas!

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

Répondre

102
  1. donner votre bouton Fermer un fx: id, si vous avez pas encore: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. Dans votre classe 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(); 
    } 
    
+3

Cette approche n'a pas fonctionné pour moi. Je reçois un 'NullPointerException' –

+0

Travaux étonnants! , juste au cas où, les gens se souviennent de vérifier le nom de votre Button (ce cas closeButton) et le nom de votre onClick (ce cas closeButtonAction) –

+0

Il ferme seulement la fenêtre, mais l'application est toujours en cours d'exécution !!! –

1

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 est un nœud Sinon, vous devez obtenir le premier noeud. (getScene() est une méthode de nœud)

13

Si vous avez une fenêtre qui Prolonge 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()); 
} 
+0

'Platform.exit()' fermera toutes les étapes et abattra toute l'application. Cela pourrait ne pas être désiré. – nonybrighto

+0

L'affiche originale demandait comment fermer une fenêtre, pas l'application. –

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

Il est équivalent à hide. Donc, quand vous allez l'ouvrir la prochaine fois, il vous suffit de vérifier si l'objet stage est quitté ou non. Si vous le quittez, vous appelez simplement show(), c'est-à-dire (stage.show()). Sinon, vous devez commencer la scène.

4

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

Dans mon FXML:

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

Dans ma Controller classe:

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

J'ai trouvé une belle solution qui n'a pas besoin d'un événement doit être déclenché:

@FXML 
private Button cancelButton; 

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

@FXML 
private void close(Event event) { 
    ((Node)(event.getSource())).getScene().getWindow().hide();      
} 
0

vous peut simplement réaliser ceci avec,

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

fera l'affaire pour vous.