Задать вопрос

Пример JAVA-приложения с использованием MVC?

В общем, не совсем понимаю как правильно разбить проект на Model, View и Controller. Если бы кто-нибудь накидал простенький пример, был бы очень благодарен. (View пишется с использованием Swing). Самая проблема возникает из-за того, что окон несколько и не совсем понятно как им взаимодействовать. И непонятно что в main пихать.



В общем, такой пример:

При запуске приложения открывается окно. В окне 2 кнопки. По нажатию одной выводится какой-нибудь текст, по нажатию другой — открывается новое окно (старое при этом убивается).



Во втором окне тоже 2 кнопки. Одна выводит текст, другая — выводит старое окно, а новое закрывает.



Как писать — понятно, мне непонятна именно архитектура.
  • Вопрос задан
  • 42609 просмотров
Подписаться 14 Оценить 2 комментария
Решения вопроса 1
serso
@serso
Например:
class MyView extends JFrame {
    ...
    JButton button = new JButton();
    button.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            Controller.getInstance().fireEvent(Events.OPEN_WINDOW);
        }
    });
    ...
}


В контроллере:
void fireEvent(Event event) {
    for (Listener listener: listeners) {
        listener.onEvent(event);
    }
}


Сам контроллер может быть event слушателем:

Controller implements Listener {
...
   void onEvent(Event event) {
        if ( event.equals(Events.OPEN_WINDOW) ) {
            // put here code for initializing and opening the window
            // NOTE: new window also can be listener of specific events
        }
    }
...
}


И работа с моделью:
 class MyView extends JFrame {
    ...
    JButton button = new JButton();
    button.addOnTextChangeListener(new TextChangeListener() {
        public void textChanged(TextChange e) {
            Controller.getInstance().fireEvent(new Event(Events.TEXT_CHANGE, e.getNewText()));
        }
    });
    ...
}   

Controller implements Listener {
...
   void onEvent(Event event) {
        if ( event.equals(Events.TEXT_CHANGE) ) {
            // find and update the module
            getTextContainer().setText(event.getData());
        }
    }
...
}


Естественно, TextChangeListener придуман для упрощения понимания, не знаю есть ли такой в Swing'e
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
serso
@serso
Всё просто — контроллер координирует действия. В вашем случае я бы сделал класс который умеет регистрировать слушателей и управлять событиями.

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

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

Войдите, чтобы написать ответ

Похожие вопросы