2013-02-12 2 views
0

Я использую JavaFX 2 совместно с Spring Framework, однако инъекция происходит с опозданием. Мой контроллер инициализируется FXML-Loader, Spring-инъекция для переменных-членов этого контроллера работает, но работает только слишком поздно, это означает, что в (1) инъекции еще не произошло, а в (2) инъекция произошла:Зависимость Инъекция слишком поздно

public class MainController extends AbstractController 
{ 
    @Autowired 
    public StatusBarController statusbarController; 

    // Implementing Initializable Interface no longer required according to 
    // http://docs.oracle.com/javafx/2/fxml_get_started/whats_new2.htm: 
    private void initialize() { 
     BorderPane borderPane = (BorderPane)getView();   
     borderPane.setBottom(statusbarController.getView()); // (1) null exception! 
    } 

    // Linked to a button in the view 
    public void sayHello() { 
     BorderPane borderPane = (BorderPane)getView();   
     borderPane.setBottom(statusbarController.getView()); // (2) works! 
    } 
} 

Любой способ, которым Spring приносит statusbarController в более раннем состоянии? Я не могу позволить пользователю придется нажать на кнопку, чтобы загрузить мой графический интерфейс ;-)

Мой AppFactory это:

@Configuration 
public class AppFactory 
{ 
    @Bean 
    public MainController mainController() throws IOException 
    { 
     return (MainController) loadController("/main.fxml"); 
    } 

    protected Object loadController(String url) throws IOException 
    { 
     InputStream fxmlStream = null; 
     try 
     { 
      fxmlStream = getClass().getResourceAsStream(url); 
      FXMLLoader loader = new FXMLLoader(); 
      Node view = (Node) loader.load(fxmlStream); 
      AbstractController controller = (AbstractController) loader.getController(); 
      controller.setView(view); 
      return controller;    
     } 
     finally 
     { 
      if (fxmlStream != null) 
      { 
       fxmlStream.close(); 
      } 
     } 
    } 
} 

ответ

2

Вы должны установить ControllerFactory на FXMLLoader так, что вы отвечаете за создавая экземпляр контроллера.

+0

Спасибо, что исправляет проблему! Для записей: есть пример, например. здесь http://koenserneels.blogspot.de/2012/11/javafx-2-with-spring.html (поиск setcontrollerfactory) –

Смежные вопросы