JavaFX2 の新しい世界を学んでいるときに、別の厄介な問題に出くわしました。複数のシーン (~10 シーン) を持つプログラムを開発しています。そのために、次のような小さなクラスを作成しました。
public class SceneSelector {
...
public void setScene(Stage stage, String fxmlfilename, ObservableList ol) throws Exception{
String s = "../" + fxmlfilename;
Parent root = FXMLLoader.load(getClass().getResource(s));
root.setUserData(ol);
Scene scene = new Scene(root);
stage.setScene(scene);
//show the stage
stage.show();
}
}
このクラスは、シーンを切り替えるのに十分に機能します。問題は、時々 Scene1 から Scene2 にデータを渡す必要があることです。setUserData()
基本的に1つのことを除いて機能する新しいシーンを設定することで、これをやろうとしています。新しいシーンが初期化されているときにユーザーデータを取得するにはどうすればよいですか? (その時点でノードはまだ null であるため)
シーン 1 のコード:
//Code connected to a button that opens the new Scene
private void openLabID(ActionEvent event) throws Exception {
final Stage primaryStage = (Stage) btnNewScene.getScene().getWindow();
ObservableList<Koe> olAfTeWerkenKoeien = DA_Koe.getAfTeWerkenKoeien();
ss.setScene(primaryStage, "GUI/scenes/koe/Koe.fxml", olAfTeWerkenKoeien);
}
シーン 2 のコード:
public void initialize(URL url, ResourceBundle rb) {
Scene s = lbl.getScene();
ObservableList<Koe> olAfTeWerkenKoeien = (ObservableList<Koe>) s.getRoot().getUserData();
System.out.println(olAfTeWerkenKoeien.size());
}
もちろん、Scene s はこの時点で null 値を返します (この時点で lbl は null であるため)。
このコードを Scene2 のボタンにアタッチすると、おまじないのように機能しますが、自動的に読み込まれるはずです。
編集: setMyData() メソッドを使用したデータの設定は問題ありませんが、取得は次のとおりです。
public ObservableList<Koe> getMyData() {
return this.myData;
}
コントローラーの初期化時に CustomScene オブジェクトを取得するにはどうすればよいですか? 以下でこれを行うと NullPointerException が発生するため (btnSluiten がまだ初期化されていないため):
@Override
public void initialize(URL url, ResourceBundle rb) {
...
Stage stage = (Stage) btnSluiten.getScene().getWindow();
CustomScene cs = (CustomScene) stage.getScene();
ObservableList<Koe> olKoe = cs.getMyData();
System.out.println(olKoe.size());
}