我正在尝试在 java swing ui 应用程序中遵循 MVP(特别是被动视图)模式。
应用程序的基本设计提醒了一个向导控件。屏幕分为两个主要部分:
- 一个活跃的视图。
- 带有导航按钮的静态导航栏。
用户可以使用按钮来更改活动视图,但始终显示栏。
为这个场景建模,我有一堆不同的 screers,每个都有自己的演示者、视图接口和视图实现(使用 JPanel)。然后我有一个 Shell 演示者,使用 JFrame 查看接口和查看实现。这个想法是外壳将首先加载并始终显示,显示底部导航栏并为活动视图留出空间。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 界面是通用的并且因此对 JPanel 一无所知时。显然我不希望我的演示者也知道 JPanels。