2012-09-15 35 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中遇到困难的话。 –

相关问题