如何引用primaryStage [复制](How to reference primaryStag

2019-06-27 02:59发布

这个问题已经在这里有一个答案:

  • 如何从一个控制器类打开文件选择JavaFX的? 4个回答

我用.fxml档案我的应用程序的视图层。 每个FXML具有连接到它的控制器

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

假设我有一台主机,它的控制器。 该mainFrame.fxml被加载到start(Stage) -方法。

现在你想显示其连接到阶段/窗/无论文件选择。

对于这将是很好的让FXML控制器了解例如 primaryStage

有没有办法把它注入到控制器,还是在FXML知道在运行时哪个场景和舞台是属于?

唯一的想法我已经是存储在primaryStage一些静态的背景,但似乎不喜欢的方式那样对我。

Answer 1:

不FXML但在FXML节点(对照组)(或在其控制器)知道他们属于哪个场景和舞台在运行时(被添加到场景之后)。
在控制器类,

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

或者您可以使用CDI事件得到初级阶段。 看博客条目FXML和JavaFX的搭载CDI与JBoss的焊接 。



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


Answer 3:

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;
      }

     }


文章来源: How to reference primaryStage [duplicate]