Каковы хорошие практики для связывания контроллеров JavaFX вместе? - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь создать свое первое «настоящее» приложение с java с использованием JavaFX. Я использую F XML для разработки всего этого, поэтому я решил разделить некоторые части на разные файлы .fxml и связать их с разными контроллерами. Я использую один MainController, связанный с main.fxml, а внутри main.fxml я вызываю некоторые другие файлы f xml, используя fx:include. Все включает свой собственный контроллер.

Проблема в том, что контроллеры не работают на 100% независимо, иногда вы хотите нажать кнопку, связанную с одним контроллером, и передать это что-то другому контроллеру. У меня есть решение, которое работает, но я не уверен, что это лучший способ сделать это.

Мое решение таково: иметь один абстрактный класс SubController, который имеет защищенные поля stati c для каждого из субконтроллеров. После инициализации MainController заполняет все эти поля классами контроллеров, которые он получает из main.fxml, а также одно поле для самого MainController. Каждый из субконтроллеров наследуется от SubController, чтобы иметь доступ к полям stati c и вызывать методы publi c других контроллеров.

public abstract class SubController implements Initializable {

    protected static MainController mainController;
    protected static MenuBarController menuBarController;
    protected static VideoPanelController videoPanelController;

    public static void setMainController(MainController mainController) {
        SubController.mainController = mainController;
    }

    public static void setMenuBarController(MenuBarController menuBarController) {
        SubController.menuBarController = menuBarController;
    }

    public static void setVideoPanelController(VideoPanelController videoPanelController) {
        SubController.videoPanelController = videoPanelController;
    }
}
public class MainController implements Initializable {

    @FXML private MenuBarController menuBarController;
    @FXML private VideoPanelController videoPanelController;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        SubController.setMainController(this);
        SubController.setMenuBarController(menuBarController);
        SubController.setVideoPanelController(videoPanelController);

    }

Таким образом, когда в строке меню нажимается кнопка, он может использовать метод publi c контроллера видеопанели:

public class MenuBarController extends SubController {

    public void openVideo() {
        File selectedFile = chooseFiles(VIDEO_EXTENSIONS);
        if (selectedFile == null) return;
        videoPanelController.loadVideo(selectedFile);
    }

}

Это работает довольно хорошо, но я все еще чувствую, что, вероятно, есть более простой способ сделать Это. Это хороший способ go об этом, а если нет, то как еще мне это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...