2013-10-09 17 views
6

JavaFXでFXMLLoader#load()を呼び出すとどうなりますか?FXMLLoaderはどのようにFXMLのコントローラをロードしますか?

FXMLコントローラがコンストラクタを持つクラスを拡張しているとします。コンストラクタが呼び出されるという保証はありますか?そうでない場合、オブジェクトの新しいインスタンスはどのように作成されますか?たとえば、以下のコードでTextField()コンストラクタが呼び出されますか?

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TextField; 
public class FXMLController extends TextField implements Initializable { 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

    }  
} 

私はすでに、この1つを検索しようとしたが、脇からそれについてはドキュメントがないように思える「FXML文書からオブジェクト階層をロードします。」 http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html

あなたの回答は高く評価されます。どうもありがとう!

答えて

13

「コントローラを構築する際FXMLLoaderが正確に何をするのでしょうか?」:

最初のそれは、コントローラのインスタンスを取得しようとします:

  • コントローラインスタンスセットがすでに存在する場合FXMLLoaderでは、このインスタンスが使用されます。
  • FXMLLoaderにコントローラファクトリが設定されていない場合、リフレクションごとのクラスの引数なしコンストラクタを呼び出そうとします。これが失敗すると、InstantiationExceptionがスローされます。
  • コントローラファクトリセットがある場合、このファクトリを呼び出して新しいコントローラインスタンスを作成します。

は、コントローラのインスタンスを取得した後、それはそれで次の操作を行います。このクラスは初期化可能を実装

  • た場合、それが公共のボイドのinitialize(URLのURL、ResourceBundleをするResourceBundle)を呼び出します。そうでない場合は、引数がゼロのinitializeというメソッドがあり、それをリフレクションで呼び出すかどうかを調べます。そうでなければ、何もしません。
+0

うわー。迅速な返信をありがとう。プロセスは興味深いように聞こえる。あなたの情報源を教えてもらえますか? –

+0

この動作を非常に簡単にテストすることができます。また、openjdk – Sebastian

+0

で利用可能なソースコードで確認することもできます。 openjdkをチェックするかもしれません。 –

1

私はあなたが何をしようとしているかは完全にはわかりませんが、通常、コントローラはテキストフィールドを拡張すべきではありません。

これは基本的なJavaのものです。テキストフィールドには空のコンストラクタがあり、コントローラには何もありません。したがって、javaは(デフォルトで)TextFieldで使用可能な空のコンストラクタを呼び出します。 TextFieldコンストラクタは、デフォルトでは(コードに含まれていない場合でも)、拡張するクラスのコンストラクタなどを呼び出します。コンストラクタを呼び出さずにJavaでオブジェクトを構築する方法はありません。あなたの質問に答えるために

+0

すばらしい、返信いただきありがとうございます。私はコントロールを制御できるテキストフィールドのようなものがあると思っています。 –

関連する問題