I want to set some non-UI fields in the controller before the initialize
method of the controller gets called automatically upon creation. As I understand it, the way to do it is to provide custom ControllerFactory
, since initialize()
gets called after ControllerFactory
returns the created object. I wanted to use the following code as per this answer:
FXMLLoader loader = new FXMLLoader(mainFXML); // some .fxml file to load
loader.setControllerFactory(param -> {
Object controller = null;
try {
controller = ReflectUtil.newInstance(param); // this is default behaviour
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
if (controller instanceof Swappable) {
((Swappable) controller).setSwapper(swapper); // this is what I want to add
}
return controller;
});
However, the ReflectUtil
class (which is used in default setControllerFactory
method) is part of com.sun.reflect.misc
package, which I am not able to use, since compiling fails with error: package sun.reflect.misc does not exist
.
As I understand it, I can't use sun packages, since this is not public API. So the question is: what do I do? I can't find any other examples of this, only the ones with ReflectUtil and, well, I want my ControllerFactory
to comply with default workflow of JavaFX with @FXML annotations and all that. Is there some other way to inject a field maybe? (other than to synchronize on it and wait in initialize()
until the setter method gets called from other thread).
Aucun commentaire:
Enregistrer un commentaire