我正在尝试在Java Swing UI应用程序中遵循MVP(特别是被动视图)模式。
应用程序的基本设计类似于向导控件。屏幕分为两个主要部分:
- 一个活动视图。
- 一个静态导航栏,带有导航按钮。
用户可以使用按钮更改活动视图,但导航栏始终显示。
对于这种情况的建模,我有一堆不同的屏幕,每个屏幕都有自己的Presenter、View接口和View实现(使用JPanel)。然后我有一个Shell Presenter、View接口和View实现,使用一个JFrame。这个想法是,Shell将首先加载并始终显示,显示底部导航栏并留出空间给活动视图。Shell Presenter将允许设置当前活动屏幕,就像这样:
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的内容。显然,我也不希望我的presenters知道关于JPanels的任何内容。