使用Java Swing应用程序的Model-View-Presenter设计模式

时间:2016-02-22 11:14:39

标签: java swing user-interface mvp

我正在开发一个用于组织个人音乐集的Java应用程序,允许用户借助表格中显示的文本列表搜索他们的数字音乐库,选择要播放的歌曲并提供有关它们的信息,例如Rekordbox(https://rekordbox.com/en/)。

在对如何设计和实现这样一个系统进行一些研究后,我遇到了模型 - 视图 - 演示者设计模式,据我所知,它是一种允许灵活,可重用和测试驱动的代码。

所以来解决我的问题:

  1. 查看类:假设我想要一个包含JFrame的Swing UI,其中包含3个JPanel,作为 单独的视图类 。即 MainFrameView ,其中 MenuBarView,TablePanelView,PlayerPanelView 是在框架内创建的(这是一个视图类本身)。这些面板内部有各种Swing组件,如JMenuBar,JTable,JButtons,JProgressBar。
  2. 模型类:我拥有的两个模型是 TableModel (由 TablePanelView 用于显示用户的音乐库,并存储他/她的目录的路径) List中的歌曲和 PlayerModel (由 PlayerPanelView 用来操纵用户选择的数字音频文件,即播放/暂停/停止歌曲,快进等) PlayerModel 使用用户歌曲目录选择来初始化自己。
  3. 所以,我的问题是如何实现Presenter,以便不同的视图(使用不同的模型)能够在彼此之间进行通信和共享信息?我应该有一个演讲者可以与之交谈的演示者,还是每个视图都有一个演示者?如果有可能有一个演示者如何实现?如果我有 MenuBarView,TablePanelView和PlayerPanelView 的一个Presenter,并且这些视图包含在另一个视图( MainFrameView )中,我应该以某种方式组合演示者,并且如果有,怎么样?

1 个答案:

答案 0 :(得分:0)

如果我是你,我会在尝试MVP之前尝试MVC(模型视图控制)模式。它非常相似,但我想说它更容易理解。

我不会为MenuBar创建自己的视图,因为您可能不会动态创建它。只需在MainFrameView中编写一个初始化它的方法,然后在MainView的构造函数中调用它。

模型是您使用的项目的属性。现在,如果您想创建一个具有自己模型的Panel,但又想要从MainFrameView访问该模型,您只需为它编写一个Getter / Setter。在MainFrameView中看起来像这样:

public TablePanelView tpv;
public void initTablePanelView(TablePanelModel tpm){
  tpv = new TablePanelView();
  tpv.setModel(tpm);
}

因此,您可以使用在TablePanelView中编写的公共方法getModel()或setModel()来访问模型。

我希望有所帮助。