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