web-dev-qa-db-ja.com

primaryStageの参照方法

アプリケーションのビューレイヤーに.fxml-Filesを使用しています。各fxmlにはコントローラーが接続されています

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

MainFrameがあり、それがコントローラーであるとしましょう。 mainFrame.fxmlはstart(Stage)- methodにロードされます。

次に、ステージ/ウィンドウ/何にでもアタッチされているfileChooserを表示します。

そのためには、fxml-controllerにたとえばprimaryStageを知らせるのが良いでしょう。

それをコントローラーに注入する方法はありますか、それともFXMLは実行時にどのシーンとステージに属するかを知っていますか?

私が持っている唯一のアイデアは、ある静的コンテキストにprimaryStageを格納することですが、それは私にはそれを行う方法のようではないようです。

18
Gundon

FXMLではなく、FXML(またはそのコントローラー)のノード(コントロール)は、実行時に(シーンに追加された後)、どのシーンとステージに属しているかを認識しています。
コントローラクラスでは、

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

または、CDIイベントを使用してプライマリステージを取得できます。ブログエントリ FXML&JavaFX powered by CDI&JBoss Weld をご覧ください。

31
Uluk Biy

堅牢なソリューション(スニペットとして使用できます):イベントを受け取り、そのイベントを発生させた制御を取得します。そのコントロールを使用してステージを取得します。

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

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

     }
4
Shashank