アプリケーションのビューレイヤーに.fxml-Filesを使用しています。各fxmlにはコントローラーが接続されています
_<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">
_
MainFrameがあり、それがコントローラーであるとしましょう。 mainFrame.fxmlはstart(Stage)
- methodにロードされます。
次に、ステージ/ウィンドウ/何にでもアタッチされているfileChooserを表示します。
そのためには、fxml-controllerにたとえばprimaryStage
を知らせるのが良いでしょう。
それをコントローラーに注入する方法はありますか、それともFXMLは実行時にどのシーンとステージに属するかを知っていますか?
私が持っている唯一のアイデアは、ある静的コンテキストにprimaryStageを格納することですが、それは私にはそれを行う方法のようではないようです。
FXMLではなく、FXML(またはそのコントローラー)のノード(コントロール)は、実行時に(シーンに追加された後)、どのシーンとステージに属しているかを認識しています。
コントローラクラスでは、
...
@FXML private Label label;
...
// in some method block
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();
または、CDIイベントを使用してプライマリステージを取得できます。ブログエントリ FXML&JavaFX powered by CDI&JBoss Weld をご覧ください。
堅牢なソリューション(スニペットとして使用できます):イベントを受け取り、そのイベントを発生させた制御を取得します。そのコントロールを使用してステージを取得します。
@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());
}
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;
}
}