将 Model-View-Presenter 设计模式用于 Java Swing 应用程序
Using the Model-View-Presenter design pattern for a Java Swing application
我正在开发一个 Java 用于组织个人音乐的应用程序 collections,它允许用户借助 [=57= 中显示的文本列表来搜索他们的数字音乐库],选择要播放的歌曲并提供有关它们的信息,例如 Rekordbox (https://rekordbox.com/en/)。
在对如何设计和实现这样一个系统进行一些研究之后,我遇到了 Model-View-Presenter 设计模式,据我所知,这是一种模式允许编写灵活、可重用和测试驱动的代码。
所以来解决我的问题:
- View classes:假设我想要一个 Swing UI,它由一个 JFrame 组成,其中有 3 个 JPanel 作为 单独的视图classes。即 MainFrameView 和 MenuBarView、TablePanelView、PlayerPanelView,它们是在框架内创建的(这是一个视图 class 本身)。这些面板内部有各种 Swing 组件,例如 JMenuBar、JTable、JButtons、JProgressBar。
- Model classes:我有的两个模型是TableModel(被TablePanelView用来显示用户的音乐库并将 his/her 歌曲的目录路径存储在 List 中)和 PlayerModel(由 PlayerPanelView 用来操作用户选择的数字音频文件,即 play/pause/stop 歌曲、快进等)PlayerModel 使用用户选择的歌曲目录来初始化自身。
所以,我的问题是如何实现 Presenter,以便不同的视图(使用不同的模型)能够相互通信和共享信息?我应该有一个单独的 Presenter 来与视图交谈还是每个视图都有一个 Presenter?如果有可能只有一个演示者,那如何实现?如果我有一个用于 MenuBarView、TablePanelView 和 PlayerPanelView 的 Presenter,并且这些视图包含在另一个视图(即 MainFrameView )中,我应该将主持人以某种方式,如果是的话如何?
如果我是你,我会在尝试 MVP 之前尝试 MVC(模型视图控制)模式。它非常相似,但我会说它更容易理解。
我不会为 MenuBar 创建自己的视图,因为您可能不会动态创建它。只需在初始化它的 MainFrameView 中编写一个方法,然后在 MainView 的构造函数中调用它。
模型是您使用的项目的 属性。现在,如果您想创建一个具有自己模型的面板,但也想从 MainFrameView 访问该模型,您只需为其编写一个 Getter/Setter。在 MainFrameView 中看起来像这样:
public TablePanelView tpv;
public void initTablePanelView(TablePanelModel tpm){
tpv = new TablePanelView();
tpv.setModel(tpm);
}
因此您可以使用您在 TablePanelView 中编写的 public 方法 getModel() 或 setModel() 来访问模型。
希望对您有所帮助。
我正在开发一个 Java 用于组织个人音乐的应用程序 collections,它允许用户借助 [=57= 中显示的文本列表来搜索他们的数字音乐库],选择要播放的歌曲并提供有关它们的信息,例如 Rekordbox (https://rekordbox.com/en/)。
在对如何设计和实现这样一个系统进行一些研究之后,我遇到了 Model-View-Presenter 设计模式,据我所知,这是一种模式允许编写灵活、可重用和测试驱动的代码。
所以来解决我的问题:
- View classes:假设我想要一个 Swing UI,它由一个 JFrame 组成,其中有 3 个 JPanel 作为 单独的视图classes。即 MainFrameView 和 MenuBarView、TablePanelView、PlayerPanelView,它们是在框架内创建的(这是一个视图 class 本身)。这些面板内部有各种 Swing 组件,例如 JMenuBar、JTable、JButtons、JProgressBar。
- Model classes:我有的两个模型是TableModel(被TablePanelView用来显示用户的音乐库并将 his/her 歌曲的目录路径存储在 List 中)和 PlayerModel(由 PlayerPanelView 用来操作用户选择的数字音频文件,即 play/pause/stop 歌曲、快进等)PlayerModel 使用用户选择的歌曲目录来初始化自身。
所以,我的问题是如何实现 Presenter,以便不同的视图(使用不同的模型)能够相互通信和共享信息?我应该有一个单独的 Presenter 来与视图交谈还是每个视图都有一个 Presenter?如果有可能只有一个演示者,那如何实现?如果我有一个用于 MenuBarView、TablePanelView 和 PlayerPanelView 的 Presenter,并且这些视图包含在另一个视图(即 MainFrameView )中,我应该将主持人以某种方式,如果是的话如何?
如果我是你,我会在尝试 MVP 之前尝试 MVC(模型视图控制)模式。它非常相似,但我会说它更容易理解。
我不会为 MenuBar 创建自己的视图,因为您可能不会动态创建它。只需在初始化它的 MainFrameView 中编写一个方法,然后在 MainView 的构造函数中调用它。
模型是您使用的项目的 属性。现在,如果您想创建一个具有自己模型的面板,但也想从 MainFrameView 访问该模型,您只需为其编写一个 Getter/Setter。在 MainFrameView 中看起来像这样:
public TablePanelView tpv;
public void initTablePanelView(TablePanelModel tpm){
tpv = new TablePanelView();
tpv.setModel(tpm);
}
因此您可以使用您在 TablePanelView 中编写的 public 方法 getModel() 或 setModel() 来访问模型。
希望对您有所帮助。