torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFX 2でアプリケーション作成(その14)

id:torutk:20120515の続きです。

FXMLにコントローラクラスを定義しました。Java側コードでコントローラクラスのインスタンスを使用したいときは、FXMLを読み込んだFXMLLoaderのgetControllerメソッドで取得します。

しかし、getControllerメソッドがnullを返すので、動作させるまでに一苦労しました。

コントローラクラスを取得するためのコードの変更

前回書いていたFXML読み込み処理

	Scene scene = (Scene) FXMLLoader.load(
	    getClass().getResource("semaphore.fxml")
	);

FXMLLoaderクラスのgetControllerメソッドはインスタンスメソッドなので、このコードではgetControllerメソッドは使えません。そこで、まず

        FXMLLoader loader = new FXMLLoader();
	Scene scene = (Scene) loader.load(
	    getClass().getResource("semaphore.fxml")
	);
        SemaphoreController controller = (SemaphoreController) loader.getController();

とFXMLLoaderインスタンスを生成し、FXMLファイルをロードし、そしてgetControllerを呼ぶ手順としましたが、getControllerの戻り値がnullとなってしまいます。

	FXMLLoader loader =
	    new FXMLLoader(getClass().getResource("semaphore.fxml"));
	Scene scene = (Scene) loader.load();
	SemaphoreController controller =
	    (SemaphoreController) loader.getController();

とFXMLLoaderインスタンス生成時にFXMLファイルのURLを渡すとnullを回避できました。

(2014-01-02追記)

FXMLLoaderのloadメソッドは、インスタンスメソッドとクラスメソッドとが混在し、引数の違いで定義が異なります。getControllerがnullを返すのは、クラスメソッドのloadを使った場合です。

<T> T load()
<T> T load(InputStream in)
static <T> T load(URL loc)
static <T> T load(URL loc, ResourceBundle res)
static <T> T load(URL loc, ResourceBundle res, BuilderFactory fac)
static <T> T load(URL loc, ResourceBundle res, BuilderFactory fac, Callback<Class<?>, Object> ctrlFac)