如何在JavaFX中为自定义节点设置ControllerFactory?

时间:2018-03-14 19:49:02

标签: java javafx fxml

我有一些带有一些自定义节点的通用布局,每个节点都有自己的控制器。由于我想将相同的对象注入到每个控制器中,为了在它们之间共享数据,我创建了一个自定义的ControllerFactory。

要为根节点设置ControllerFactory,我在Main(扩展Application)类的start方法中有以下工作代码:

FXMLLoader loader = new FXMLLoader(getClass().getResource("layout.fxml"));
Main self = this;
loader.setControllerFactory((Class<?> param) -> {
        return self.instantiateController(param);
});

实例化instantiateController方法只是暂时创建一个新传递的类,并记录实例化了哪种类:

public Object instantiateController(Class<?> c) {
    Object o = null;
    try {
        o = c.newInstance();
    } catch (InstantiationException | IllegalAccessException ex) {
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
       throw new RuntimeException(ex);
    }
    System.out.println(o.getClass() + " instantiated");
    return o;
}

这样,我可以观察到哪些控制器被实例化了。它始终只是根元素的Controller,而不是其中一个自定义节点。即使它们被实例化并显示为需要,它们也永远不会被我的工厂考虑在内。这样,我无法注入我想要的对象。如何使工厂应用于所有嵌套控制器?

0 个答案:

没有答案