Я пытаюсь следовать шаблону MVP (в частности, пассивному просмотру) в приложении java swing ui.
Базовый дизайн приложения напоминает мастера управления. Экран разделен на две основные части:
- активный вид.
- статическая панель навигации, с кнопками навигации.
Пользователь может использовать кнопки, чтобы изменить активный вид, но панель всегда отображается.
Моделируя этот сценарий, у меня есть куча разных экранов, каждый со своим презентатором, интерфейсом представления и реализацией представления (с использованием JPanel). Затем у меня есть докладчик Shell, просмотр intefrace и просмотр реализации, используя JFrame. Идея состоит в том, что оболочка будет загружаться первой и всегда отображаться, показывая нижнюю панель навигации и оставляя место для активного просмотра. Спикер оболочки позволит установить текущий активный экран, примерно так:
interface View {
}
class Presenter {
View view;
public Presenter(View view) {
this.view = view;
}
public View getView() {
return view;
}
}
interface ShellView extends View {
void setActiveView(View activeView);
}
class ShellPresenter extends Presenter {
private ShellView shellView;
public void setActivePresenter(Presenter activePresenter) {
shellView.setActiveView(activePresenter.getView());
}
}
class ShellFrame implements ShellView {
private JFrame frame;
private JPanel activePanel;
private JPanel navigationBar;
public ShellFrame() {
Container c = frame.getContentPane();
c.add(activePanel);
c.add(navigationBar);
}
public setActiveView(View activeView) {
???
}
}
Проблема в методе setActiveView: я не уверен, как установить activeView в activePanel, когда интерфейс View является общим и поэтому ничего не знает о JPanels. Очевидно, я бы не хотел, чтобы мои докладчики знали о JPanels.