Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX控制器如何访问其他服务?_Java_Scala_Javafx 2 - Fatal编程技术网

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

JavaFX控制器如何访问其他服务?,java,scala,javafx-2,Java,Scala,Javafx 2,我将JavaFX2与Scala一起使用 我有一个类应用程序扩展了javafx.Application.Application,它可以读取应用程序配置等,然后启动主窗口 此主窗口需要连接到名为MainWindow的控制器。我可以使用fx:controller=“com.foo.bar.MainWindow”来执行此操作,但是在这种情况下,MainWindow的实例无法访问我的应用程序的配置等 我想到的一件事是在应用程序类中自己实例化主窗口控制器,并注入所有依赖项,然后告诉主窗口视图控制器应该是我刚

我将JavaFX2与Scala一起使用

我有一个
类应用程序扩展了javafx.Application.Application
,它可以读取应用程序配置等,然后启动主窗口

此主窗口需要连接到名为
MainWindow
的控制器。我可以使用
fx:controller=“com.foo.bar.MainWindow”
来执行此操作,但是在这种情况下,
MainWindow
的实例无法访问我的应用程序的配置等

我想到的一件事是在
应用程序
类中自己实例化
主窗口
控制器,并注入所有依赖项,然后告诉主窗口视图控制器应该是我刚刚创建的实例。但是,我不知道该怎么做

在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">
...
我对我的应用程序的引用,其中包含我想要访问的信息:

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

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

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

现在Guice将创建您的控制器。我建议您插入控制器需要的任何服务,而不是传递对应用程序类的引用。

感谢您注册发布您的答案!这很有帮助,但是您知道如何编写
实现回调以及什么是
注入器
?我在JavaFX包中找不到它。对不起,我对Scala几乎一无所知。我相信java和scala泛型可以进行互操作,如果它们不能互操作,那么您将很难使用javafx。Injector是Guice的一部分,或者在Guice 3中是javax.Injector包中。您需要下载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 loader = new FXMLLoader();         
loader.setControllerFactory(controllerFactory);