簡體   English   中英

JavaFX控制器如何訪問其他服務?

[英]How can JavaFX controllers access other services?

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

問題是我如何獲得對主應用程序的引用? 如何進行依賴注入或任何等效注入?

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將創建你的控制器。 我建議您注入控制器所需的任何服務,而不是傳入對應用程序類的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM