3

私はScalaでJavaFX2を使用しています。

アプリの設定を読み取るなどのclass Application extends javafx.application.Application処理を行うものがあります。その後、メインウィンドウが起動します。

このメインウィンドウは、と呼ばれるコントローラーに接続する必要がありますMainWindow。私はそれを行うことができますがfx:controller="com.foo.bar.MainWindow"、この場合、のインスタンスはMainWindow私のアプリケーションの構成などにアクセスできません。

私の頭に浮かんだことの1つは、クラスMainWindow内でコントローラーを自分でインスタンス化し、すべての依存関係を挿入してから、コントローラーを作成したばかりのインスタンスにする必要があることをメインウィンドウビューに通知することです。Applicationしかし、私はこれを行う方法がわかりませんか?

ある種の依存性注入などを介して、JavaFXのコントローラーのデータにアクセスするための好ましい方法は何ですか?

言い換えると、このビューFXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.Scene?>
<?import javafx.scene.control.*?>

<BorderPane fx:controller="com.foo.bar.MainWindow" prefHeight="703.0" prefWidth="803.0" xmlns:fx="http://javafx.com/fxml">
...

私のためにコントローラーを自動的にインスタンス化しますcom.foo.bar.MainWindowか(?):

...
class MainWindow {
  var app: Application = null
  ...
}

アクセスしたい情報を保持しているアプリケーションへの参照があります。

class Application extends javafx.application.Application {
  ...
  // Stuff I want to access, application also fires up the first scene.
}

問題は、どうすればメインアプリケーションへの参照を取得できるかということです。依存性注入または同等のものをどのように実行できますか?

4

1 に答える 1

6

Guiceは、コントローラーを注入するための私の好ましい方法です。次のコントローラーファクトリを使用する必要があります。

class GuiceControllerFactory implements Callback<Class<?>, Object> {

    private final Injector injector;

    public GuiceControllerFactory(Injector anInjector) {
        injector = anInjector;
    }

    @Override
    public Object call(Class<?> aClass) {
        return injector.getInstance(aClass);
    }
}

FXMLLoaderに設定します。

FXMLLoader loader = new FXMLLoader();         
loader.setControllerFactory(controllerFactory);

これで、Guiceがコントローラーを作成します。アプリケーションクラスへの参照を渡すのではなく、コントローラーが必要とするサービスを注入することをお勧めします。

于 2012-09-15T20:34:41.093 に答える