18

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

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

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

Stage/Window/Whatever にアタッチされた fileChooser を表示したいとします。

そのためには、 fxml-controller にfor 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 イベントを使用してプライマリ ステージを取得することもできます。ブログ エントリFXML & JavaFX powered by CDI & JBoss Weld を見てください。

于 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 に答える