当前位置: 首页 > 知识库问答 >
问题:

Guice模块配置中FXML与控制器的关联

欧阳嘉年
2023-03-14

在我的Guice模块中,我希望将FXML文件和它们的控制器关联起来,目前看起来如下所示:

public class GuiceModule extends AbstractModule 
{   
    @Override
    protected void configure()
    {
        // associate controllers and fxml files
        bind(MainController.class).toInstance((MainController)loadController("/main.fxml"));
        bind(SubController.class).toInstance((SubController)loadController("/content.fxml"));
    }

    protected Object loadController(String url)
    {
        InputStream fxmlStream = null;
        try
        {
            fxmlStream = getClass().getResourceAsStream(url);
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource(url));


            loader.setControllerFactory(new Callback<Class<?>, Object>() {

                public Object call(Class<?> clazz) { // clazz because class is a reserved word
                    return injector.getInstance(clazz); // PROBLEM: no access to the injector here
                }
            });

            loader.load(fxmlStream);
            return loader.getController();
        }

        // [..] exception handling

    }
}**strong text**
return injector.getInstance(clazz); // PROBLEM: no access to the injector here

共有1个答案

盖弘毅
2023-03-14

我是fx-guice的作者,这是一个开源库,可用于在JavaFX应用程序中使用Guice。该库使用Apache License v2获得许可,可以通过中央Maven存储库获得。

尽管它可能不能确切地回答您的问题,但我建议您看看我的项目,它附带了许多示例:
project Home:→ http://github.com/cathive/fx-guice/

我的框架的主要思想是:不扩展“javafx.application.application”,而是扩展“com.cathive.fx.GuiceApplication”。然后,您只需在任何需要的地方@inject“guicefxmlloader”实例,并可以使用这些特殊的FXMLLoader实例加载UI定义。在FXML-controller类中,您可以根据需要混合@inject和@fxml注释。
→ http://bit.ly/139fkqv

我的框架还提供了一系列与“Guicified”JavaFX组件有关的功能,这些组件将Java类和单个FXML文件绑定在一起(使用一个特殊的注释:“@FXMLComponent”)。我写了一个简短的“计算器”示例,其来源可以从Github页面中获得(见上文)。代码的相关部分可以在这里找到:
CalculatorApppane.java:→ http://bit.ly/10ymvom
CalculatorApppane.fxml:→ http://bit.ly/13loyv8

希望能有所帮助。-)

 类似资料:
  • 问题内容: 我有一个提供这样的JDBI 实例: 在另一个模块中,我想在该DBI实例上调用一些初始化方法(配置对特定数据类型的支持)。放入JDBI模块本身是不合适的逻辑,因为它是特定于应用程序的,而不是使用JDBI的任何应用程序所通用的。我是否可以进行这种“额外”配置? 我尝试使用该方法,但似乎没有为以这种方式提供的对象调用该方法。 问题答案: 该吉斯注射文档描述了如何通过注释与@注入的方法来调用一

  • 问题内容: 我有一个提供这样的JDBI 实例: 在另一个模块中,我想在该DBI实例上调用一些初始化方法(配置对特定数据类型的支持)。放入JDBI模块本身是不合适的逻辑,因为它是特定于应用程序的,而不是使用JDBI的任何应用程序所通用的。我是否可以进行这种“额外”配置? 我尝试使用该方法,但似乎没有为以这种方式提供的对象调用该方法。 问题答案: 该吉斯注射文档描述了如何通过注释与@注入的方法来调用一

  • 我一次又一次地寻找这件事,但毫无结果。我有一个连接到控制器的JavaFXFXML窗口;此窗口已打开。单击窗口上的按钮会触发打开另一个FXML文件,该文件链接到其各自的控制器。 第二个窗口(optionsUI.fxml和optioncontroller)有几个单选按钮。单击一个按钮时,我希望在mainUI窗口中更改图像/按钮的位置。我该怎么做呢? 主控制器: 我面临的主要问题是在单选按钮上添加一个事

  • 使用控制器工厂的问题: 到目前为止,我最好的方法是使用Stephen Chin方法连接顶层控制器。 对于有多个bean实例的情况,父控制器将通过@autowire/@qualifer获取对特定bean的引用,然后在相应的控制器上设置。 下一级控制器也可以通过在顶层控制器上公开它们并调用autowire()来连接 有没有使用控制器工厂机制,这样我就可以在spring上下文中定义控制器,以便更容易地将

  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类: