Как сослаться на primaryStage

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

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

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

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

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

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

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


person Gundon    schedule 16.08.2012    source источник
comment
Этот вопрос на 2 года старше указанного и уже ответил. Как это дубликат другого сейчас @fabian?   -  person Gundon    schedule 18.10.2016
comment
Очевидно, оба вопроса касаются одной и той же проблемы; Один из них - дубликат. Я просто выбрал вопрос с меньшим баллом как обман. BTW: Тот факт, что на вопрос был дан ответ, не означает, что это не обман. Это просто означает, что до ответа на него не было достаточно близких голосов. Если вы не согласны с этим решением, вы все равно можете пометить его для внимания модератора и / или поднять на Meta Stack Overflow.   -  person fabian    schedule 18.10.2016


Ответы (3)


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

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

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

person Uluk Biy    schedule 17.08.2012
comment
Однако, если этот блок метода равен initialize(URL location, ResourceBundle resources) после того, как вы реализовали Initializable, то приведенный выше код выдаст вам исключение NullPointerException. - person Tomasz Mularczyk; 24.03.2015

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

@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());
}
person zoran    schedule 30.06.2016
comment
Это единственное, что у меня сработало после двух часов рыскания в ИНТЕРНЕТЕ. - person Sam Orozco; 23.08.2016

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

     }
person Shashank    schedule 08.03.2013
comment
Не могли бы вы объяснить вместо того, чтобы давать однострочные ответы. Спасибо. - person Freakyuser; 08.03.2013
comment
@Freakyuser Я отредактировал свой ответ - person Shashank; 08.03.2013
comment
Я не верю, что это ответ на вопрос. По крайней мере, я не подхожу к моему варианту использования. Мы хотим, чтобы контроллеры FXML были отделены от основного приложения. Для таких случаев больше подходит метод от: Улук Бий. - person will; 04.12.2014
comment
почему бы просто не сделать статическую ссылку на первичный этап в start методе класса приложения? так что позже вы можете просто использовать MainClass.primaryStage;? - person Tomasz Mularczyk; 24.03.2015
comment
Томек. +1 за простоту! Спасибо, что напомнили мне о силе статического модификатора. - person rafaelbattesti; 02.10.2015