Шаблон MVC в JavaFX с помощью Scene Builder

Я новичок в JavaFX и изо всех сил пытаюсь создать надлежащую архитектуру MVC с учетом моей текущей настройки. Я щелкнул вместе пользовательский интерфейс с помощью Scene Builder и назначил класс Controller.

Startup:

public class Portal extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml"));

        stage.setTitle("Portal");
        stage.setScene(new Scene(root));
        stage.show();
    }
}

И класс Controller содержит остальную часть кода.

public class AccommodationPortalView implements Initializable {
    @Override
    public void initialize(URL url, ResourceBundle resources) {
    // Work here.
    }
}

Мой профессор попросил меня разделить озабоченность и ответственность этого приложения. Контроллер не только управляет состоянием и разговаривает с бэкэнд, но также обновляет представление.

Мой первый ответ состоял в том, чтобы позволить классу Controller стать View и создать два других класса для Controller и Model.

Однако я не понимаю, как подключить эти штуки. Мне никогда не нужно создавать экземпляр представления, поэтому нет экземпляра представления, который я могу передать, например, моему контроллеру. Затем я попробовал сделать все синглеты и просто дать контроллеру их во время выполнения, но это дает мне ошибку.

public class Portal extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml"));

        stage.setTitle("Portal");
        stage.setScene(new Scene(root));
        stage.show();

        // Controller gets a View and Model instance in initialize();
        // Error: Instantiation and Runtime Exception...
        PortalController.INSTANCE.initialize();
    }
}

Как правильно настроить шаблон MVC с помощью моей текущей конфигурации? Требуется ли другая архитектура?

Ответы

Ответ 1

Ваш,
- Просмотр - это первичный Stage, предоставляемый платформой JavaFX при запуске. Этот этап имеет только Scene (вы создали и установили), который, в свою очередь, имеет родительский node контент root (ваша переменная). Этот root node задается FXMLLoader и представляет структуру layout/node, определенную в файле PortalUI.fxml.
Другими словами, Stage -> Scene -> PortalUI.fxml(root) определит часть представления.

- Контроллер - это класс, реализующий Initializable и указанный вами в файле PortalUI.fxml с атрибутом fx: controller = ". Класс, который вы указали там (PortalController, я полагаю), будет создан и вызывается его методом initialize() с помощью FXMLLoader. А именно, контроллер будет создан при загрузке файла PortalUI.fxml, поэтому вам не нужно создавать и инициализировать его самостоятельно. Чтобы получить созданный/инициализированный экземпляр контроллера из FXMLLoader, просмотрите доступ к классу контроллера FXML.

- Модель - это базовая структура данных, хранящаяся и управляемая контроллером. Это может быть что угодно, представляющее "данные". Например, Person, PortalInfo и т.д. Классы.