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!
7 réponses
- donnez à votre bouton de fermeture un fx: id, si vous n'avez pas encore:
<Button fx:id="closeButton" onAction="#closeButtonAction">
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(); }
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());
}
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();
}
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)
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();
}
vous pouvez simplement cela,
@FXML
private void closeAction(ActionEvent evt){
System.exit(0);
}
va faire l'affaire pour vous.
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.