2016-07-23 5 views
0

いくつかの「子」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クラスのメソッドを持っている:私は、コンストラクタでそれを渡すことができますので、SubLayout1RootControllerを渡す

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); 
+0

*: – fabian

答えて

0

は、私は私のコードを簡素化し、(動的に決定された)ファイル名に基づいて、クラス型を決定することによって、状況を解決することができましたFXMLLoaderブロック?*これを明確にすることはできますか?コントローラをどのように作成しますか? fxmlで `fx:controller`を使用していますか?ファクトリ/戦略/コマンドパターンの使用?
関連する問題