Как управлять обновлениями представления от контроллеров в Java-приложении Swing

Я обнаружил, что писать хороший объектно-ориентированный код с помощью Swing невероятно сложно. Моя проблема в основном в том, что у меня есть представление (JPanel), в котором есть прослушиватели действий. Слушатели действий выясняют, какая кнопка была нажата, и вызывают соответствующий метод контроллера. Проблема в том, что этому методу контроллера необходимо обновить другое представление. Итак, проблема, с которой я сталкиваюсь, заключается в том, что у меня есть представления, которые повсюду передаются контроллерам. Вот пример.

public class MyView extends JPanel implements ActionListener {
  private final MyController controller = new MyController();

  @Override public void actionPerformed(ActionEvent e) {
    this.controller.updateOtherView();
  }
}

По сути, это то, чего я хочу, но вот что в итоге происходит.

public class MyView extends JPanel implements ActionListener {
  private MyController controller = new MyController();
  private OtherView otherView;

  public MyView(MyOtherView otherView) {
    this.otherView = otherView;
  }

  @Override public void actionPerformed(ActionEvent e) {
    this.controller.updateOtherView(otherView);
  }
}

И вы можете видеть, что по мере увеличения количества представлений, которые необходимо обновить, и количества классов, которые выглядят подобным образом, представления, по сути, являются глобальными переменными, а код становится сложным и непонятным. Еще одна проблема, с которой я сталкиваюсь, заключается в том, что это другое представление обычно не передается напрямую в MyView, но оно должно пройти через родителей MyView, чтобы добраться до MyView, что действительно просто раздражает меня.

В качестве реального примера предположим, что у меня есть меню и этот MyView. MyView имеет кнопку воспроизведения, которая некоторое время воспроизводит музыку и отключает (затеняет) кнопку воспроизведения до тех пор, пока музыка не закончится. Если у меня есть пункт меню под названием «Воспроизведение», теперь мне нужно получить доступ к кнопке воспроизведения других представлений, чтобы я мог сделать ее серой.Как я могу сделать это без этого надоедливого прохождения просмотров повсюду? Хотя могут быть конкретные решения для этой проблемы, я ищу что-то, что решит эту проблему доступа к представлению в общем случае.

Я вообще не знаю, как это исправить. В настоящее время я использую терминологию шаблона MVC, не используя шаблон MVC, который может быть или не быть необходимым. Любая помощь приветствуется.

5
задан gsingh2011 16 June 2012 в 18:30
поделиться