2016-10-01 2 views
1

Итак, у меня есть главный контроллер из основного файла fxml и два других контроллера из файлов include. Теперь я добавляю дочерние контроллеры через @FXML ChildController childController. Теперь это работает, и все, кто работал с FXML, знают, о чем они говорят. Вложение зависимостей с аннотацией - все в порядке, но я хочу сделать это сам, потому что у меня есть собственные планы по обработке всех DI.Java-альтернатива внедрению контроллеров @FXML?

(вопрос ниже)

Это, как я инициируют всю вещь:

public void start(Stage primaryStage) throws Exception {  
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("Some resource")); 

    MainController mainController = new Controller(); 
    loader.setController(mainController); 

    Scene scene = new Scene(loader.load(), w, h); 

    primaryStage.setScene(scene); 

    primaryStage.show(); 
} 

В основном я хочу сделать это:

SubController1 A = new SubController1(); 
SubController2 B = new SubController2(); 
MainController C = new MainControllerC(A, B); 

Так как я могу сделать это с FXML (JavaFX)?

ответ

2

Вы можете использовать фабрику контроллера. Если вы установили фабрику контроллера на FXMLLoader, тот же завод-контроллер будет использоваться, когда будут загружены все файлы FXML, включенные <fx:include>.

Итак:

Callback<Class<?>, Object> controllerFactory = new Callback<Class<?>, Object>() { 

    SubController1 a = new SubController1(); 
    SubController2 b = new SubController2(); 
    MainController c = new MainController(a, b); 

    @Override 
    public Object call(Class<?> type) { 
     if (type == SubController1.class) { 
      return a ; 
     } 
     if (type == SubController2.class) { 
      return b ; 
     } 
     if (type == MainController.class) { 
      return c ; 
     } 
     return null ; 
    } 
}; 

А потом

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource(...)); 
loader.setControllerFactory(controllerFactory); 
Parent root = loader.load(); 

Файлы FXML просто объявить классы контроллеров обычным способом, используя fx:controller="...".

Заводы контроллера могут быть довольно мощными: вы можете использовать фабрику контроллеров, чтобы разрешить инфраструктуру инъекции зависимостей (например, Spring или Guice) управлять контроллерами для вас (и, в случае необходимости, встраивать в них зависимости).

+0

Омг наконец! это выглядит интересно. Сколько лет опыта у вас есть? :) – Asperger

+0

Im действительно благодарен за все ваши большие взносы за качество в stackoverflow. Я следил за многими вашими сообщениями. Ты замечательный! – Asperger

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