Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reference primaryStage [duplicate]

I use .fxml-Files for the view-layer of my application. Each fxml has a controller attached to it

<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">

Let's assume I have a mainFrame and it's controller. The mainFrame.fxml is loaded in the start(Stage)-method.

Now you would like to show a fileChooser which is attached to a Stage/Window/Whatever.

For that it would be good to let the fxml-controller know about the for example primaryStage.

Is there any way to inject it to the controller, or does the FXML know at runtime to which scene and stage it belongs?

Only idea I have is to store primaryStage in some static context, but that seems not like a way to do it to me.

like image 613
Gundon Avatar asked Aug 16 '12 19:08

Gundon


2 Answers

Not FXML but the nodes (controls) in FXML (or in its Controller) know to which scene and stage they belong at runtime (after being added to the scene).
In controller class,

...
@FXML private Label label;
...
// in some method block
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();

Alternatively you can use CDI events to get the primary stage. Look the blog entry FXML & JavaFX powered by CDI & JBoss Weld.

like image 65
Uluk Biy Avatar answered Nov 15 '22 18:11

Uluk Biy


Robust solution (can be used as a snippet): Take an event and then get control that fired that event. Use that control to get the Stage:

@FXML
private void browseDirectory(ActionEvent event) {
    Stage stage = Stage.class.cast(Control.class.cast(event.getSource()).getScene().getWindow());
    DirectoryChooser directoryChooser = new DirectoryChooser();
    File selectedDirectory = directoryChooser.showDialog(stage);
    System.out.println(selectedDirectory.getAbsolutePath());
}
like image 24
zoran Avatar answered Nov 15 '22 18:11

zoran