【问题标题】:How can JavaFX controllers access other services?JavaFX 控制器如何访问其他服务?
【发布时间】:2012-09-15 16:35:08
【问题描述】:

我正在使用带有 Scala 的 JavaFX 2。

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

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

我想到的一件事是在Application 类中自己实例化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">
...

会自动为我实例化一个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.
}

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

【问题讨论】:

    标签: java scala javafx-2


    【解决方案1】:

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

    【讨论】:

    • 感谢您注册并发布您的答案!这很有帮助,但你知道我如何在 Scala 中编写 implements Callback&lt;Class&lt;?&gt;, Object&gt; 部分吗?
    • Injector 是什么?我在 JavaFX 包中找不到它。
    • 抱歉,我对 Scala 几乎一无所知。我确信 java 和 scala 泛型可以互操作,如果他们不这样做,您将很难使用 javafx。
    • Injector 是 Guice 的一部分,或者在 Guice 3 中它位于 javax.inject 包中。您需要下载 Guice 并将其添加到您的类路径中才能编译上述代码。
    猜你喜欢
    • 2019-03-28
    • 2019-06-12
    • 1970-01-01
    • 2014-10-23
    • 2015-09-14
    • 2016-02-29
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多