组件注入事件后的JavaFX控制器

时间:2014-04-08 18:56:08

标签: javafx javafx-8

我正在寻找一种在控制器上注册FXML组件注入的方法。 所以我会有这样的方法

void AfterComponenetInjection();

一旦注入FXML组件,就会被解雇。

1 个答案:

答案 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();