Как организовать контроллер программы на основе MVC с несколькими экранами / панелями? - PullRequest
2 голосов
/ 06 января 2009

В настоящее время я работаю над хобби-проектом, написанным на Java, содержащим около двух разных JFrames с примерно 3-4 JPanels каждый. Проблема, с которой я сталкиваюсь, заключается в том, что я не совсем уверен, как справиться с взаимодействием с моим контроллером и различными классами представлений.

Например, у меня есть статья Sun о Java-приложении. дизайн с MVC , где они перечисляют опцию, позволяющую всем коммуникациям между моделью и представлением проходить через контроллер, как самую современную, тактику, которой меня тоже учили, и она должна отлично справляться. Тем не менее, это не так глубоко, как объяснить, как обрабатывать все ActionListeners, задействованные для всех элементов и различных панелей.

«Путь», которому меня учили до сих пор, состоит в том, чтобы либо использовать один контроллер и установить ActionListener для различных объектов через геттеры, и отслеживать активную панель. Альтернатива, которую дает моя удивительная книга по Java, - это просто придерживаться внутренних классов для каждого класса представления. Кажется, что любой из этих методов приводит к довольно неприятному коду, в то время как я бы предпочел один или несколько контроллеров с как можно меньшим раздутием.

Мой вопрос, конечно, таков; Как бы вы назначили ActionListeners как можно более аккуратно и эффективно при сохранении возможности использования контроллера (ов)?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2009

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

В случае, если вы добавляете / удаляете элемент списка в ответ на событие, существует вероятность того, что в списке появятся параллельные изменения; событие обрабатывается, но цикл будет продолжаться в случае, если после элемента, перехватывающего событие, будет больше элементов.

Поэтому требуется использовать немного другой подход. Я решил использовать метод ListIterator.add (), так как он поддерживает модификации списка при просмотре его элементов. Возможно, есть более элегантные решения, но это делает работу довольно приличной.

В случае, если это поможет другим; модифицированный код будет выглядеть следующим образом:

ListIterator<ActionListener> iterator = mActionListeners.listIterator();

public void actionPerformed(ActionEvent e)
{
    iterator = mActionListeners.listIterator();
    while (iterator.hasNext()) 
    {
        ActionListener actionListener = (ActionListener)iterator.next();
        actionListener.actionPerformed(e);
    }
}

public void addListener(ActionListener listener)
{
    iterator.add(listener);
}

public void removeListener(ActionListener listener)
{
    iterator.remove(listener);
}

В случае, если есть лучшие решения или улучшения, я тоже буду рад их услышать.

0 голосов
/ 06 января 2009

Контроллер может реализовывать ActionListener и содержит список ActionListener.

Контроллер, который вы должны добавить к слушателю действий 3-4 верхних панелей. Теперь вы можете добавить любой ActionListener, который вы хотите, в список прослушивателей действий контроллера.

public void addListener(ActionListener listener)
{
   mActionListeners.add(listener);
}

public void removeListener(ActionListener listener)
{
   mActionListeners.remove(listener);
}

Когда вызывается прослушиватель действий контроллера, вы должны вызывать всех прослушивателей действий, находящихся в списке управления.

public void actionPerformed(ActionEvent e) {
   List listeners = mActionListeners; // Edit 20090903
   for (Iterator iterator = listeners .iterator(); iterator.hasNext();) {
    ActionListener actionListener = (ActionListener)iterator.next();
    actionListener.actionPerformed(e);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...