Как убедиться, что каждый контроллер может видеть модель и инициализируется только один раз? - PullRequest
0 голосов
/ 04 июня 2018

В моем mainController я использую следующий метод для изменения представлений:

@FXML
public void handleChangeView(ActionEvent event) {
    try {
        String changeButtonID = ((Button) event.getSource()).getId();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("../../resources/view/" + changeButtonID + ".fxml"));
        mainView.setCenter(loader.load());
    } catch (IOException e){
e.printStackTrace();
    }
}

Теперь это работает, но у меня есть две проблемы:

1) С каждой кнопкой нажимайте контроллерзагруженного файла FXML запускается снова.Например, в моем другом контроллере у меня есть:

            Timeline counterTimeline = new Timeline(new KeyFrame(Duration.seconds(1), e -> System.out.println("Test")));
            counterTimeline.setCycleCount(Animation.INDEFINITE);
            counterTimeline.play();

С каждым щелчком мыши создается новая временная шкала и устанавливается ее воспроизведение - как я могу гарантировать, что этого не произойдет?Кажется, что каждый раз, когда нажимается кнопка изменения вида контроллера, он повторно инициализируется.

2) Как я могу гарантировать, что каждый контроллер может видеть модель, все еще используя вышеуказанный метод для изменения представлений?Я бы предпочел избегать инъекций зависимостей, потому что я, честно говоря, не могу обернуть голову вокруг этого - после 6 часов, пытаясь заставить afterburner.fx работать, я не могу справиться с этим.

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете создавать новые узлы fxml только один раз для каждого типа:

private final Map <String, Parent> fxmls = new HashMap<>();

@FXML
public void handleChangeView(ActionEvent event) {
   try {
    String changeButtonID = ((Button) event.getSource()).getId();
    Parent newOne = fxmls.get(changeButtonID);
    if (newOne == null) {
      FXMLLoader loader = new FXMLLoader(getClass().getResource("../../resources/view/" + changeButtonID + ".fxml"));
      newOne = loader.load();
      fxmls.put(changeButtonID, newOne):
    }
    mainView.setCenter(newOne);
  } catch (IOException e){
    e.printStackTrace();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...