JavaFX 2でアプリケーション作成(その14)
JavaFX 2でアプリケーション作成(その13) - torutkのブログの続きです。
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)