JavaFX控制器如何访问其他服务?

时间:2012-09-15 16:35:08

标签: java scala javafx-2

我在Scala中使用JavaFX 2。

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

此主窗口需要连接到名为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.
}

问题是我如何获得对主应用程序的引用?如何进行依赖注入或任何等效注入?

1 个答案:

答案 0 :(得分: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将创建你的控制器。我建议您注入控制器所需的任何服务,而不是传入对应用程序类的引用。