【问题标题】:swing and mvc - where place the listenerswing 和 mvc - 放置侦听器的位置
【发布时间】:2015-04-01 21:30:51
【问题描述】:

我正在尝试编写一个 swing 应用程序并学习一些有关 mvc 模式的知识。另外我想保持我的 Swing 代码干净,所以我把我的 GUI 分成不同的类。 该类结构的一部分如下所示:

//all classes extending BasicGuiElement
-EntireContentElement  has:
---ControlElement  has:
------MainMenuElement

MainMenuElement 包含 MainMenuBar、Menu 和 MenuItem。现在,不同的 MenuItem 需要不同的 ActionListener。

这是我的问题:这个 ActionListener 应该从哪里来?我是否应该在视图中创建 EntireControlElement,向其传递 HashMap 并将此映射通过所有元素传递给 MainMenuElement?如果我有很多类都需要一堆动作监听器,我会传递一个监听器映射列表吗?那将是非常丑陋的代码,不是吗?

另一种解决方案是将模型作为 ModelInterface 传递给视图,并从动作侦听器中调用模型方法,这些方法将在视图类中创建……这会是更好的方法吗?

谢谢!

【问题讨论】:

  • 模型和视图,一般来说,不应该相互了解,应该由控制器桥接,这意味着控制器应该充当视图的观察者并响应适当的事件.您可以做的一件事是定义视图和控制器之间的契约,该契约描述视图可以执行的操作(甚至是通用的“菜单事件”),控制器可以对其做出反应。您可以将ActionListeners 直接附加到视图中的组件,然后将适当的事件触发回控制器。
  • 展示了这个想法here

标签: java swing model-view-controller


【解决方案1】:

作为@MadProgrammer 在其评论中的好例子的替代方案,有一种鲜为人知的模式,称为 MVP(模型-视图-演示者)。它是传统 MVC 的一种变体,其目标是使视图尽可能地笨拙(不了解或引用模型、控制器或任何其他应用程序代码),以便所有要测试的代码都在 GUI 之外。

要使用 MVP 回答您的问题,模型是“独立的”,对视图或演示者/控制器一无所知。同样,视图也是“独立的”,对模型或演示者/控制器一无所知。 Presenter 是两个将监听器逻辑注入到 View 之间的桥梁。

对于比较/对比,有一个 MVP 示例可以是 seen here, 这是对 MVC 示例 seen here 的重写。

另见:

Wiki: Model-View-Presenter

ObjectMentor: The Humble Dialog Box

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2011-08-16
    • 2017-11-05
    相关资源
    最近更新 更多