将 MVP 模式应用于 JDialogs

2023-12-05

我正在编写一个 Swing 应用程序,并进一步我之前的问题,已决定使用模型-视图-呈现器模式将用户界面与业务逻辑分开。

当我的应用程序启动时,它会执行以下代码:

Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);

presenter.init();

它创建用户界面。事件是由View,并委托给Presenter. The Presenter然后操纵Model并更新View因此。

为了处理一些事件,我需要从用户那里获取更多信息。在这些事件的情况下,我认为 Swing 视图生成一个新的是合适的JDialog window.

一种思路让我觉得这可能是原始代码中合适的代码Presenter:

public void handlePreferences() {
    Preferences prefs = view.getPreferences();
    model.setPreferences(prefs);
}

也就是说,每个内容JDialog应该代表一个不同的对象,应该从View并更新于Model。然而,这留下了一个问题:我是否创建一个新的Model来代表Preferences对象和一个新的Presenter用于事件处理JDialog?

在我看来,创造一个新的Presenter and Model原始内部View例如,如果我想更改 UI 以使用 JSF,这会迫使我做很多很难移植的工作。

请随时添加评论以进行澄清。


尽管“嵌套”设计模式并不罕见,但在您的情况下没有必要。借鉴其他答案:

Model
- 包含所有真实数据、变量、对象
- 知道如何将其存储的数据值设置为新值
- 响应命令(方法调用)
- 有方法 setPreferences(value1,value2,value3...);

View
- 是应用程序的IO,只是输出和输入
- 它只能对其自身、其状态起作用
- 它维护局部变量和对象,例如。它有 JButtons、JMenus、int 计数器...
- 它知道如何通知 Presenter 状态变化
- 其状态对 Presenter 可见,或通过方法调用显示
- 响应命令(方法调用)
- 知道如何获取用户的偏好
- 有方法askForPrefs();
- 有方法 getPrefState();

主持人
- 响应状态变化
- 做所有的决定,它告诉其他对象要做什么(而不是如何做)
- 知道何时需要偏好
- 知道从哪里获得新的偏好以及将它们放在哪里
- 有方法 newPrefsAvailable();

...从用户那里获取更多信息。在这些事件的情况下,我认为 Swing 视图生成一个新的 JDialog 窗口是合适的。

演示者 - 检查模型,确定需要新的首选项
演示者 - this.myView.askForPrefs(); //告诉视图向用户询问偏好值
View.askForPrefs - 弹出一个JDialog框,retVals作为状态改变存储在视图中
查看 - this.myPresenter.newPrefsAvailable();
Presenter - 使用 this.myModel.setPreferences (this.myView.getPrefState()) 进行响应;
Model.setPreferences - 将存储的值更改为 View.getPrefState()
演示者 - 检查模型 - 确定偏好良好
主持人-继续

JDialog 被视为 View 的扩展,它是 View 的成员,就像 JButton 一样。 模型具有权威的实际偏好值,视图具有表示 JDialog 状态的局部变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 MVP 模式应用于 JDialogs 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • MySQL:选择前n个最大值?

    我对需要返回特定列上具有最大值的前 N 行的查询感到非常困惑 例如 如果行N 1 N N 1具有相同的值 我必须返回吗just top N or top N 1 rows 如果你这样做 select from t order by valu
  • 渲染透明外壳

    假设我正在渲染神奇女侠驾驶她的隐形喷气机 射流由多个网格组成 大部分是透明的 在透明网格重叠的地方 它变得更加不透明 我不想有这种重叠 这样透明部分仍然有阴影 但材质会丢弃其他片段后面的透明片段 就好像神奇女侠坐在透明的外壳内一样 也许一个
  • 下载并使用现代 CMake 构建 Lua

    让我们尝试通过 cmake 构建 lua 动机 cmake 通过 CLion 等 IDE 获得更多关注和支持or甚至视觉 Studio 2017 及更新版本 如果您想提供独立于平台的开源并促进整个构建过程 那么这非常有用 现在的问题是创建一
  • 如何在 Angular 中定义枚举类型以不违反 tslint typedef 规则

    为了能够在模板中使用枚举 我们在 ts 文件中编写以下代码 在工作流程Progress ts中 export enum WorkflowProgress cancelled 0 inProgress done 在组件 ts中 export
  • python中numpy多维数组的非相邻切片

    我有一个多维数组 a a np random uniform 1 10 2 4 2 3 10 10 对于维度 4 6 我有 3 个列表 其中包含用于切片数组 a 的该维度的索引 dim4 0 2 dim5 3 5 9 dim6 1 2 7
  • 打印所有对 n 个整数求和的方法,使它们的总和达到给定的和。

    我正在尝试提出一种算法 该算法将打印出对 N 个整数求和的所有可能方法 以便它们总计达到给定值 例子 打印所有对 4 个整数求和的方法 使它们的总和为 5 结果应该是这样的 5 0 0 0 4 1 0 0 3 2 0 0 3 1 1 0 2
  • ANDROID - ExpandableListView

    我试图弄清楚如何构建一个包含 许多 的视图 PARENT1 可勾选 可扩展 子级 1 单选按钮 子级 2 单选按钮 PARENT2 可勾选 可扩展 儿童 1 可勾选 儿童2 可勾选 要点是父级必须是可检查的 并且子级必须更改图标 有人可以指
  • @JsonCreator 和 mixin 通过模块不适用于第 3 方类

    我正在尝试反序列化 java net HttpCookie 它没有默认的无参数构造函数 并且得到 org codehaus jackson map JsonMappingException 找不到类型 简单类型 类 java net Htt
  • 在 Firebase 和代码中编写规则

    Firebase 建议除了代码 swift java 等 中的规则之外 我们还可以在其控制台的在线 Firebase 规则部分中编写安全规则 数据库 存储 为什么是这样 我感觉这样会重复吗 这在客户端 服务器架构中很常见 服务器must验证
  • NSApplication 和 -applicationDidFinishLaunching:

    我有一个应用程序 其中我有一个main m返回NSApplicationMain argc const char argv 我想运行代码 applicationDidFinishLaunching 但我只是不知道该怎么做 任何人都可以帮忙或
  • C++ 有没有关闭计算机的函数?

    C 有没有关闭计算机的函数 因为我怀疑是否有一个 至少在标准库中 所以我可以从 C 调用的 Windows 函数是什么 基本上 用 C 关闭 Windows XP 计算机的代码是什么 在 Windows 上 您可以使用此处描述的 ExitW
  • 如何设置 dr7 寄存器的值以便在 x86-64 上创建硬件断点?

    我正在开发一个允许使用的 绑定 库ptrace 在 OCaml 语言中 但我的问题仅涉及ptrace 所以 现在 我正在尝试编写一小段代码 以便使用以下命令在 Linux x86 64 上创建一个简单的硬件断点ptrace define D
  • 将字符串转换为日期,格式:“dd.mm.yyyy”

    D lt 06 12 1948 which is dd mm yyyy as Date D d m y convert to date 1 2019 12 06 我缺少什么 Sys getlocale 类别 LC ALL 1 LC COLL
  • 使用 php gd2 将图像从一种格式保存为另一种格式

    我有一个数据库 其中有一列填充图像二进制数据 经过一些研究后 我弄清楚了如何检测数据的图像格式 可以说我的图像列中的记录位于gif格式 现在我想用 php gd2 将其保存到jpeg格式 请问 有人可以告诉我该怎么做吗 如果您只想将图像数据
  • 如何在嘈杂的曲线中找到拐点?

    I have the the noisy curve defined by numpy 2D array 正如您所看到的 它有第一个平坦阶段 然后是上升 峰值和衰减阶段 我需要找到上升阶段的起点 此处用红点标记 我如何在 python 中做
  • 如何从 vimscript 循环内插入文本?

    看来从 help while文档说明 NOTE The append and insert commands don t work properly inside a while and for loop 我可以确认他们没有 但是我应该使用
  • LINQ to Sql 左外连接与 Group By 和having 子句

    我花了一天时间尝试将 sql 查询转换为 LINQ lambda 表达式 但没有成功 Mysql查询 SELECT a ID Sum b Value AS Value c ContractValue FROM Contracts a LEF
  • 将 UIImage 转换为 NSData 但保留为 GIF 文件

    我有一个 UIImage 它是一个 GIF 文件 我需要将其变成 NSData 对象 但它需要保留 GIF 所以我不能使用 UIImageJPEGRepresentation 有任何想法吗 一旦它成为 UIImage 它就不再是 gif 了
  • 使用 PHPMailer 发送电子邮件 - 在正文中嵌入图像

    我正在尝试使用 PHPMailer 发送带有图像的 HTML 邮件 正文是从包含所有信息的 html 文件加载的 发送邮件时 图像不会出现在正文中 尽管我什至也将图像作为附件发送 HTML img 标签指向与该地点相同的地点 PHP mai
  • 将 MVP 模式应用于 JDialogs

    我正在编写一个 Swing 应用程序 并进一步我之前的问题 已决定使用模型 视图 呈现器模式将用户界面与业务逻辑分开 当我的应用程序启动时 它会执行以下代码 Model model new BasicModel Presenter pres