2012-09-15 30 views
3

我正在使用JavaFX 2和Scala。JavaFX控制器如何訪問其他服務?

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

問題是,我如何獲得對主應用程序的引用?我怎樣才能做依賴注入或任何等效的東西?

回答

6

吉斯是注入控制器我的首選方式,你需要使用下面的控制器工廠:您FXMLLoader

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

現在吉斯將創建您的控制器。我建議你注入你的控制器需要的任何服務,而不是傳入你的應用程序類的引用。

+0

感謝您註冊發佈您的答案!這有很大的幫助,但是你知道我該如何編寫Scala實現Callback ,Object>'部分? – Tower

+0

什麼是'注射器'?我無法在JavaFX包中找到它。 – Tower

+0

對不起,我幾乎不瞭解Scala。我相信Java和Scala泛型可以互操作,如果他們不會在javafx中遇到困難的話。 –

相關問題