18

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

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

假设我有一个 mainFrame 并且它是控制器。mainFrame.fxml 在 - 方法中加载start(Stage)

现在您想显示一个附加到 Stage/Window/Whatever 的 fileChooser。

为此,最好让 fxml-controller 了解example primaryStage

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

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

4

3 回答 3

35

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

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

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

于 2012-08-17T09:44:33.727 回答
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());
}
于 2016-06-30T11:04:37.120 回答
4

http://code.makery.ch/java/javafx-2-tutorial-part5

这是一个很好的教程,其中包含示例代码示例

       Controller...

      //Application class type variable
      public MainApp mainApp;
      public Stage stage;
       .........
       .........

     /**
      * Is called by the main application to give a reference back to itself.
      * 
      * @param mainApp
      */
       public void setMainApp(MainApp mainApp) {
       this.mainApp = mainApp;


       }
       }

       .....

       .........
       @FXML
       public void initialize(){

       stage=mainApp.getStage();



      }


      Application class....

      class MainApp extends Application{

      Stage stage;
       ...
          ...

      @Override
      public void start(Stage stage) {
      this.stage=stage;
      FXMLLoader loader = new  
      FXMLLoader(MainApp.class.getResource("view/PersonOverview.fxml"));
      PersonOverviewController controller = loader.getController();

      controller.setMainApp(this);
     }

        ...
            ,,

      public getStage()
     {

      return this.stage;
      }

     }
于 2013-03-08T11:23:12.397 回答