3

我将 JavaFX 2 与 Scala 一起使用。

我有class Application extends javafx.application.Applicationwhich 会执行诸如读取应用程序配置等操作。然后它会启动主窗口。

这个主窗口需要连接到一个名为MainWindow. 我可以使用 来做到这一点fx:controller="com.foo.bar.MainWindow",但是,在这种情况下,实例MainWindow无法访问我的应用程序的配置等。

我想到的一件事是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 回答