Я пытаюсь следовать за MVP (конкретно Пассивное Представление), шаблон в Java качает ui приложение.
Базовая конструкция приложения напоминает управлению мастером. Экран разделен к двум основным частям:
Пользователь может использовать кнопки для изменения активного представления, но панель всегда отображается.
Моделируя этот сценарий, я имею набор diffirent screers, каждого со своим собственным предъявителем, просматриваю интерфейс и просматриваю реализацию (использующий 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 является общим, и doens't как таковые знают что-либо о JPanels. Очевидно, я не хотел бы, чтобы мои предъявители знали о JPanels также.
Не могли бы вы изменить определение View на:
interface View {
JComponent getContainer();
}
Чтобы каждое представление могло легко получить содержимое представления? Оболочка не должна знать, какая реализация JComponent возвращается.
Интерфейс вашего представления должен обеспечивать способ получения чего-либо, отображаемого в JPanel:
interface View {
Component getComponent();
}
Затем в ShellFrame (при условии, что вы используете BorderLayout, как и я) вы можете установить представление следующим образом:
public setActiveView(View activeView) {
activePanel.add(activeView.getComponent(), BorderLayout.CENTER);
}