如何引用主舞台

2022-09-02 19:36:57

我将 .fxml-Files 用于应用程序的视图层。每个 fxml 都有一个连接到它的控制器

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

让我们假设我有一个大型机,它是控制器。mainFrame.fxml 加载到 -method 中。start(Stage)

现在,您想显示一个附加到舞台/窗口/任何东西的文件选择器。

为此,最好让fxml控制器知道例如.primaryStage

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

我唯一的想法是将 primaryStage 存储在一些静态上下文中,但这对我来说似乎不是一种可行的方法。


答案 1

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

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

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


答案 2

可靠的解决方案(可用作代码段):获取一个事件,然后获取触发该事件的控制权。使用该控件获取舞台:

@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());
}

推荐