3

測定アプリケーション用の Scene Builder で Netbeans Java FX を使用したいと考えています。コントロールのあるシーンをデザインしました。「...Controller.java」内の UI コントロールからのイベントを処理できます。

「コントローラー」は、XML ファイルで参照され、システムによって次のように初期化される標準的なコードです。

public void initialize(URL url, ResourceBundle rb) { ..

私の問題: コントローラー内から中央の永続的な「モデル」オブジェクトにアクセスするにはどうすればよいですか? または、より正確には、コントローラーの初期化関数内で作成されたイベント ハンドラーから。

「モデル」オブジェクトは、アプリケーション オブジェクト内に作成されます。

解決策は簡単なはずですが、方法が見つかりませんでした

  • コントローラーからアプリケーションにアクセスするか
  • または、アプリケーション内からコントローラーにアクセスします。私は何が欠けていますか?

(次の問題は、スクリーン ビルダーによって作成されたオブジェクト階層内のペインのツリーにアクセスする方法です。たとえば、出力時のグラフィックス操作などです。オブジェクトは独自のコードで作成されていないため、それらの一部への参照を保存できません。わかりました。ツリー ウォークでそれらを見つけて参照することもできますが、もっと良い方法があるはずです!)

すべての洞察に感謝します!

4

1 に答える 1

3

私はしばらく前に、次のような 2 番目のアプローチ (アプリケーション内からコントローラーにアクセスする) を使用しました。アプリケーション クラス:

//..
private FooController fooController;
private Pane fooPage;
private Model myModel;

@Override
public void start(Stage stage) {
    //..
    myModel = new Model();
    getFooController().updateModel(myModel);
    //..
    Button button = new Button("Update model with new one");
    button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Model myNewModel = new Model();
                getFooController().updateModel(myNewModel);
            }
    }
    // create scene, add fooPage to it and show.
}

private FooController getFooController() {
    if (fooController == null) {
       FXMLLoader fxmlLoader = new FXMLLoader();
       fooPage = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
       fooController = (FooController) fxmlLoader.getController();
    }
    return fooController;
}

実際、質問の最初と 2 番目の部分は、JavaFX 2.0 + FXML で回答されています。別のタスクからのシーン値をあなたの同様の質問に更新します。

于 2012-11-05T21:29:33.170 に答える