Я обнаружил, что писать хороший объектно-ориентированный код с помощью 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, который может быть или не быть необходимым. Любая помощь приветствуется.