我正在尝试在 swing 应用程序中应用 MVC 模式。但是,鉴于您有面板的嵌套层次结构,我面临两个主要问题,例如父 -> 子 -> 孙子 -> 孙子。
问题 1:当您有这样的层次结构时,如何在 Controller 和 View 之间传输数据?如果我去将数据从 parent 传递给 child ,那么就会有很多重复,如果我改变一个 child ,所有 parent 都需要改变。我不希望 View 直接从数据库访问数据,我希望数据仅通过 Controller 传输到 View 。
问题 2:如何在这种层次结构中将事件从 View 传播到 Controller ? 我正在考虑使用 PropertyChangeListener。如果 Controller 必须采取任何操作,View 将触发 PropertyChange 事件。 Controller 将监听这些事件并执行一些操作。但同样,如果我为层次结构执行此操作,则会出现代码重复。
我有三个可能有用的想法:
- 要为每个面板使用 Controller ,但以这种方式我最终会得到很多 Controller 。
- 使用 Mediator 设计模式来提供 View 和 Controller 之间的通信。
- 使用一个 Central Reciever & Notifier 来监听来自 View 的所有属性更改事件,并通知感兴趣的 Controller 。但这只会解决我的第二个问题:
请引用下图以获得第三个想法的图片。如果是第二个,Mediator 将居中。
请评估并让我知道是否有人以更好的方式解决了此类问题。
最佳答案
我对你的问题 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/