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