JavaFX Class controller Stage/Window reference

javajavafxjavafx-2

Is there any way of getting the Stage/Window object of an FXML loaded file from the associated class controller?

Particularly, I have a controller for a modal window and I need the Stage to close it.

Best Answer

I could not find an elegant solution to the problem. But I found these two alternatives:

  • Getting the window reference from a Node in the Scene

    @FXML private Button closeButton ;
    
    public void handleCloseButton() {
      Scene scene = closeButton.getScene();
      if (scene != null) {
        Window window = scene.getWindow();
        if (window != null) {
          window.hide();
        }
      }
    }
    
  • Passing the Window as an argument to the controller when the FXML is loaded.

    String resource = "/modalWindow.fxml";
    
    URL location = getClass().getResource(resource);
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(location);
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    
    Parent root = (Parent) fxmlLoader.load();
    
    controller = (FormController) fxmlLoader.getController();
    
    dialogStage = new Stage();
    
    controller.setStage(dialogStage);
    
    ...
    

    And FormController must implement the setStage method.