我有一些带有一些自定义节点的通用布局,每个节点都有自己的控制器。由于我想将相同的对象注入到每个控制器中,为了在它们之间共享数据,我创建了一个自定义的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,而不是其中一个自定义节点。即使它们被实例化并显示为需要,它们也永远不会被我的工厂考虑在内。这样,我无法注入我想要的对象。如何使工厂应用于所有嵌套控制器?