7

JavaFX で FXMLLoader#load() を呼び出すとどうなりますか?

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) {

    }    
}

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

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

4

2 に答える 2

14

「コントローラーを構築するときに FXMLLoader は正確に何をしますか?」という質問に答えるには:

まず、コントローラー インスタンスを取得しようとします。

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

コントローラー インスタンスを取得した後、それを使用して次の処理を行います。

  • このクラスが Initializable を実装する場合、public void initialize(URL url, ResourceBundle resourceBundle) を呼び出します。そうでない場合は、引数なしで initialize というメソッドがあるかどうかを調べ、リフレクションを介して呼び出します。そうでない場合は、何もしません。
于 2013-10-09T07:50:38.290 に答える
1

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

それはさておき、これは基本的なJavaのものです.textfieldには空のコンストラクターがあり、コントローラーには何もないため、Javaは(デフォルトで)TextFieldで利用可能な空のコンストラクターを呼び出します. TextField コンストラクターは、デフォルトで (コード内になくても) 拡張するクラスのコンストラクターを呼び出します。コンストラクターを呼び出さずに Java でオブジェクトを構築する方法はありません。

于 2013-10-09T07:49:27.010 に答える