JavaFX 控制器,在组件注入事件之后

Dav*_*kys 1 javafx javafx-8

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

无效 afterComponenetInjection();

一旦注入 FXML 组件,就会触发。

Jam*_*s_D 5

没有这样的直接机制。但是,所有注入都保证在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();
Run Code Online (Sandbox Code Playgroud)