java - Swing MVC - 事件传播和数据共享

标签 java swing model-view-controller observer-pattern mediator

我正在尝试在 swing 应用程序中应用 MVC 模式。但是,鉴于您有面板的嵌套层次结构,我面临两个主要问题,例如父 -> 子 -> 孙子 -> 孙子。

问题 1:当您有这样的层次结构时,如何在 Controller 和 View 之间传输数据?如果我去将数据从 parent 传递给 child ,那么就会有很多重复,如果我改变一个 child ,所有 parent 都需要改变。我不希望 View 直接从数据库访问数据,我希望数据仅通过 Controller 传输到 View 。

问题 2:如何在这种层次结构中将事件从 View 传播到 Controller ? 我正在考虑使用 PropertyChangeListener。如果 Controller 必须采取任何操作,View 将触发 PropertyChange 事件。 Controller 将监听这些事件并执行一些操作。但同样,如果我为层次结构执行此操作,则会出现代码重复。

我有三个可能有用的想法:

  1. 要为每个面板使用 Controller ,但以这种方式我最终会得到很多 Controller 。
  2. 使用 Mediator 设计模式来提供 View 和 Controller 之间的通信。
  3. 使用一个 Central Reciever & Notifier 来监听来自 View 的所有属性更改事件,并通知感兴趣的 Controller 。但这只会解决我的第二个问题:

请引用下图以获得第三个想法的图片。如果是第二个,Mediator 将居中。

请评估并让我知道是否有人以更好的方式解决了此类问题。

enter image description here

最佳答案

我对你的问题 1 有一个建议:

您可以拥有一个包含另一个 View 模型属性的 View 模型。在您的 Controller 方法上,您只需要接收父 ViewModel,因为模型绑定(bind)器将为您绑定(bind)所有属性。

public class GrandChildViewModel{
    public Int32 SelectedDropDownItem { get; set; }
    public List<Foo> ListOfFoo { get; set; }
}

public class ChildViewModel{
    public String Name { get; set; }
    public Int32 Age { get; set; }
}
public class FatherViewModel{
    public ChildViewModel Child { get; set; }
    public GrandChildViewModel GrandChild { get; set; }
}

这是一个层次结构的例子。您的 View 将仅引用 FatherViewModel。您的 Controller 也将收到 FatherViewModel。 modelBinder 会自动完成它的工作,如果你像这样创建 HTML:

@Html.TextBoxFor(m => m.Child.Name)

它将呈现输入:

<input type="text" id="Child_Name" name="Child_Name" />

关于java - Swing MVC - 事件传播和数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291143/

相关文章:

java - 是否必须创建内部类来处理 DataBinding 中的事件?

java - 如何在 mvn 安装阶段运行 cobertura

java - 简单地将 JLabel 添加到 JPanel

java - 2 列文件名的 JTable。当更多文件添加到文件列表时自动更新?

c++ - QSortFilterProxyModel 和 columnCount

java - 使用片段而不是插件

java - 如何在Java中提取多个引用的子字符串

Java AttributedString,粗体和上标

iOS:使用你的 Appdelegate 作为小东西的模型是好的设计模式吗?

grails - 如何填充grails gsp select(下拉框)字段?