Подтвердить что ты не робот

Как обратиться к primaryStage

Я использую .fxml-Files для слоя представления моего приложения. Каждый fxml имеет прикрепленный к нему контроллер

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

Предположим, что у меня есть mainFrame и его контроллер. Файл mainFrame.fxml загружается в start(Stage) -метод.

Теперь вы хотите показать fileChooser, который привязан к Stage/Window/Whatever.

Для этого было бы хорошо сообщить fxml-контроллеру о том, например, primaryStage.

Есть ли способ внедрить его в контроллер или знает ли FXML во время выполнения, к какому сценарию и стадии он принадлежит?

Единственная идея, которую я имею, это хранить primaryStage в каком-то статическом контексте, но это не похоже на способ сделать это для меня.

4b9b3361

Ответ 1

Not FXML, но узлы (элементы управления) в FXML (или в своем контроллере) знают, к какой сцене и стадии они принадлежат во время выполнения (после добавления в сцену).
В классе контроллера

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

В качестве альтернативы вы можете использовать события CDI для получения основного этапа. Посмотрите запись в блоге FXML и JavaFX, работающие на CDI и JBoss Weld.

Ответ 2

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

     }

Ответ 3

Надежное решение (может использоваться как фрагмент): Возьмите событие, а затем получите управление, которое произвело это событие. Используйте этот элемент управления для получения сцены:

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