10

私は、カスタム実装を使用してメソッドを実験し、FXMLLoader使用しています。setControllerFactoryCallback<P,R>

ORACLE のドキュメントには、次のように記載されています。

実装は、指定されたタイプのコントローラーを作成しない、または作成できないことを示すために null 値を返す場合があります。この場合、デフォルトのコントローラー構築メカニズムがローダーによって採用されます。

私が達成したい結果は、依存性注入フレームワークを使用して、パラメーターを必要とするコントローラーを作成できますが、パラメーターを必要FXMLLoaderとしないコントローラーをロードできるようにすることです。

したがって、ViewControllerパラメーターを受け入れないクラスを使用する次の単純な FXML ファイルがある場合...

<StackPane fx:id="pane"
          xmlns:fx="http://javafx.com/fxml"
          fx:controller="my.package.ViewController">
</StackPane>

そして、次の単純なコントローラー ファクトリの実装を使用してFXMLLoader、この場合はコントローラーの構築を管理することを に通知します...

loader.setControllerFactory(new Callback<Class<?>, Object>(){
    @Override
    public Object Call(Class<?> type) {
        return null; // Let the FXMLLoader handle construction...
    }
});

メソッドを呼び出した後、クラスload()の Initialise メソッドが呼び出されることはありません (ブレークポイントでこれを確認しました)。ViewController

ViewControllerクラスのインスタンスを返すようにコントローラー ファクトリの実装を変更すると、すべてが期待どおりに機能します。

混乱を解消するのを手伝ってくれる人はいますか? インターフェイスの使い方がCallback間違っているのでしょうか、それとも ORACLE のドキュメントが間違っているのでしょうか?

4

1 に答える 1

16

javafx は、FXMLLoader で次のことを行います。

    try {
      if (controllerFactory == null) {
        setController(ReflectUtil.newInstance(type));
      } else {
        setController(controllerFactory.call(type));
      }
    } catch (InstantiationException exception) {
      throw new LoadException(exception);
    } catch (IllegalAccessException exception) {
      throw new LoadException(exception);
    }

そうです、オラクルのチュートリアルは間違っています。

于 2013-10-07T08:48:29.790 に答える