如何引用primaryStage

Gun*_*don 18 java javafx javafx-2 fxml

我将.fxml-Files用于我的应用程序的视图层.每个fxml都附有一个控制器

<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">
Run Code Online (Sandbox Code Playgroud)

我们假设我有一个mainFrame和它的控制器.mainFrame.fxml加载在start(Stage)-method中.

现在你要显示一个附加到Stage/Window/Whatever的fileChooser.

为此,让fxml-controller知道例如 primaryStage.

有没有办法将它注入控制器,或者FXML在运行时是否知道它属于哪个场景和阶段?

我只有想法是将primaryStage存储在某些静态上下文中,但这似乎不是一种对我这样做的方法.

Ulu*_*Biy 33

不是FXML,而是FXML(或其控制器)中的节点(控件)知道它们在运行时属于哪个场景和阶段(在添加到场景之后).
在控制器类中,

...
@FXML private Label label;
...
// in some method block
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用CDI事件来获得主要阶段.查看由CDI和JBoss Weld提供支持的博客文章FXML和JavaFX.

  • 但是,如果你在实现`Initializable`之后这个方法块是`initialize(URL location,ResourceBundle resources)`那么上面的代码会给你NullPointerException. (4认同)

zor*_*ran 7

强大的解决方案(可以用作代码段):接受一个事件,然后获得触发该事件的控制权.使用该控件来获取舞台:

@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());
}
Run Code Online (Sandbox Code Playgroud)