2016-01-14 44 views
45

マイApplicationクラスは次のようになりますのJavaFX FXMLコントローラ - initializeメソッドVSコンストラクタ

public class Test extends Application { 

    private static Logger logger = LogManager.getRootLogger(); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     String resourcePath = "/resources/fxml/MainView.fxml"; 
     URL location = getClass().getResource(resourcePath); 
     FXMLLoader fxmlLoader = new FXMLLoader(location); 

     Scene scene = new Scene(fxmlLoader.load(), 500, 500); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

FXMLLoaderが最初デフォルトのコンストラクタを呼び出すことにより(fx:controller介しFXMLファイルに与えられた)は、対応するコントローラのインスタンスを作成し次いでinitialize方法

public class MainViewController { 

    public MainViewController() { 
     System.out.println("first"); 
    } 

    @FXML 
    public void initialize() { 
     System.out.println("second"); 
    } 
} 

出力は次のとおり

first 
second 

なぜ、initializeメソッドが存在するのですか?コントローラを初期化するためにコンストラクタまたはinitializeメソッドを使用することの違いは何ですか?

お寄せいただきありがとうございます!

答えて

51

initializeメソッドは、すべての@FXML注釈付きメンバが注入された後に呼び出されます。いくつかの単語で

class MyController { 
    @FXML 
    TableView<MyModel> tableView; 

    public MyController() { 
     tableView.getItems().addAll(getDataFromSource()); // results in NullPointerException, as tableView is null at this point. 
    } 

    @FXML 
    public void initialize() { 
     tableView.getItems().addAll(getDataFromSource()); // Perfectly Ok here, as FXMLLoader already populated all @FXML annotated members. 
    } 
} 
62

:あなたはデータを取り込むするテーブルビューがあるとコンストラクタが最初に呼び出され、その後、任意の@FXML注釈付きのフィールドが移入され、その後、initialize()が呼び出されます。したがって、コンストラクタは.fxmlファイルで定義されたコンポーネントを参照する@FXMLフィールドにアクセスすることはできませんが、initialize()はアクセスできます。 Introduction to FXMLから引用

をその関連ドキュメントの内容が完全にロードされたときに実現するコントローラに一度呼び出される[...]コントローラが初期化を定義することができる()メソッド、 [...]これにより、実装クラスはコンテンツに対して必要な後処理を実行できます。

+1

わかりません。彼のやり方は 'FXMLLoader'ですよね?だから私は 'initialize()'メソッドを待つことに利点はないと思う。 FXMLが読み込まれると、次のコードは '@ FXML'変数にアクセスできます。確かに、彼はコンストラクターではなく開始メソッドでそれを行いますが、初期化()して自分のケースで何らかの利益をもたらすでしょうか? – codepleb

関連する問題