4

BorderPane であるルート FXML を作成しました。これには独自のルート コントローラーがあります。このボーダーペインの中央に FXML を動的に追加したいと考えています。

これらの各 fxml は、同じコントローラーであるルート コントローラーを共有します。空の FXML ファイルを作成するときに既存のコントローラーを選択することで、netbeans でこれを行いました。

また、ノードに異なる ID 名を付けましたが、ルート コントローラーはこれらの fxml のノードを認識しません。

異なる fxml で同じコントローラーを共有することは可能ですか?

前もって感謝します

4

1 に答える 1

9

バックグラウンド

コントローラー インスタンスの共有が実際に推奨されているかどうかはわかりません。少なくとも、これまでに行われたことはありません。

ロードする各 fxml のコントローラー クラスを同じ値に設定しても、同じコントローラー インスタンスを共有することにはなりません。これは、コントローラーをロードするたびに、新しいインスタンス (オブジェクト) が作成されるためです。コントローラークラス(これはあなたが望むものではないようです)。

考えられる解決策

私はこれらの解決策のいずれも試していませんが、うまくいくと信じています。

初期化メソッドは、おそらく新しい fxml ファイルをロードするたびに呼び出されます。したがって、初期化をべき等にすることで、ロジックでそれを説明する必要があります。

A. コントローラ インスタンスを手動で設定します。

  1. コントローラ クラスへのすべての参照を fxml ファイルから削除します。
  2. コントローラー クラスのインスタンスを手動で作成します。

    MyController controller = new MyController(); 
    
  3. 各 fxml をロードする前に、コントローラーをコントローラー インスタンスに設定します。

    FXMLLoader loader = new FXMLLoader();
    loader.setController(controller);
    Panel panel = (Panel) loader.load("myfxml.fxml");
    
  4. 毎回同じコントローラー参照を使用して、fxml ファイルごとに手順 3 を繰り返します。

B. コントローラ ファクトリを使用する。

fxml ローダーにコントローラ ファクトリを設定し、コントローラファクトリが常に同じコントローラ インスタンスを返すようにすることができます。

于 2013-07-29T01:32:24.793 に答える