いくつかの「子」FXMLビューを持つJavaFXアプリケーションを開発しています。私はすべての子供が "ルート"レイアウトにアクセスできるようにするのに苦労しています。ボタンをRootLayout
上でクリックされたときに(JavaFX)コントローラの名前を知らずにクラスのインスタンスをFXMLコントローラに渡すにはどうすればいいですか?
RootLayout
-> SubLayout1
-> UnknownLayout
SubLayout1
はFXMLファイルから作成されます。
は、ここに私のアプリケーションの基本的な階層です。 SubLayout1
コントローラ内
、I動的UnknownLayout
(FXML)をインスタンス化し、ロードされたコードとUnknownLayoutController
(関連するコントローラ)ファイルを有する:
FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString()));
loader.setController(controller);
loader.setRoot(this);
loader.load();
両方
file
とcontroller
はFXMLローディングの直前に割り当てられていますされている。
私はこれを動的にやっているので、UnknownLayout
またはコントローラの実際の名前が何であるか分かりません。
私の問題は、RootLayout
コントローラのインスタンスをUnknownLayoutController
に渡す方法を理解できないため、コントローラ内のメソッドにアクセスできることです。私は私がそれにRootLayout
のコントローラを渡すことができます各UnknownLayoutController
クラスのメソッドを持っている:私は、コンストラクタでそれを渡すことができますので、SubLayout1
にRootController
を渡す
public void setRootLayoutController (RootLayoutController rootController) {}
は問題ではありません。実際の名前UnknownLayout
を知らなくても、私はその方法をどのように呼び出すことができますか? FXMLLoader
ブロック内から新しいコントローラのコンストラクタを呼び出す方法はありますか?これを達成するための「ベストプラクティス」の方法はありますか?
私controller
参照がここで作成されます。
StringBuilder controller = new StringBuilder();
controller.append(title + "Controller.java");
はあなたが提供することができます任意の助けを事前にありがとうございます!
編集:私はPassing Parameters JavaFX FXMLを含むこれを達成するためにいくつかの他の提案を試みましたが、私が見つけたものはすべて、実行前に新しいコントローラの名前を知っていると仮定します。
私もUnknownLayoutController
でインターフェイスを実装するに見えたが、私は、このコードにNullPointerExceptionエラーを取得:
UnknownLayoutInterface subController = loader.getController();
subController.setRootController(rootController);
controller
変数はが問題で、コントローラの名前を保持しないことを文字列でありますしかし、文字列を同じ名前のObjectに変換してそのようにアクセスする方法さえありますか?
(FXMLタグの代わりにコード内でFXMLコントローラを定義しています)。内から新しいコントローラのコンストラクタを呼び出すための方法はあり
Class subLayout;
SubLayout2Interface subInterface = null;
try {
subLayout = Class.forName([Full Package Name] + subLayoutTitle);
subInterface = (SubLayout2Interface) subLayout.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
subInterface.setRootController(this);
*: – fabian