我正在寻找一种在控制器上注册FXML组件注入的方法。 所以我会有这样的方法
void AfterComponenetInjection();
一旦注入FXML组件,就会被解雇。
答案 0 :(得分:4)
没有这样的直接机制。但是,所有注入都保证在调用控制器的initialize()
方法之前完成,因此您可以在该方法中使用此类功能。
或者,如果您希望它在控制器本身外部,请从FXMLLoader
检索控制器;一旦load()
方法返回,注入将完成(并且initialize()
方法将完成),因此您可以在调用load()
后调用所需的任何功能。
我想第三种选择:
在控制器中定义一个BooleanProperty,并在initialize()
方法的开头将其设置为true。然后使用该属性注册一个监听器:同样,由于在调用initialize()
之前注入完成,因此在注入完成时将调用监听器。类似的东西:
public class MyController {
@FXML
private Node node1 ;
@FXML
private Node node2 ;
private final ReadOnlyBooleanWrapper injected = new ReadOnlyBooleanWrapper(this, "injected", false);
public boolean isInjected() {
return injected.get();
}
public ReadOnlyBooleanProperty injectedProperty() {
return injected.getReadOnlyProperty();
}
public void initialize() {
injected.set(true);
// other initialization...
}
}
// elsewhere...
FXMLLoader loader = new FXMLLoader(getClass().getResource(...));
MyController controller = new MyController();
loader.setController(controller);
controller.injectedProperty().addListener( /* will be invoked after injection....*/ );
Parent root = (Parent) loader.load();