JavaFX的控制器如何访问其他服务?(How can JavaFX controllers acc

2019-07-31 14:46发布

我使用JavaFX 2使用Scala。

我有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.
}

问题是,我怎样才能到主应用程序的参考? 我该怎么办依赖注入或任何等价?

Answer 1:

吉斯是注入控制器我的首选方式,你需要使用下面的控制器工厂:

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);

现在吉斯将创建您的控制器。 我建议你在你的控制器需要的,而不是在参考传递给你的应用类中的任何服务注入。



文章来源: How can JavaFX controllers access other services?