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

Java Swing MVC-事件传播和数据共享,java,swing,model-view-controller,observer-pattern,mediator,Java,Swing,Model View Controller,Observer Pattern,Mediator,我正在尝试在swing应用程序中应用MVC模式。然而,我面临两个主要问题,因为你们有嵌套的面板层次结构,例如父->子->孙子->孙子 问题1:当您有这样的层次结构时,如何在控制器和视图之间传输数据?如果我去把数据从父母传给孩子,那么会有很多重复,如果我改变一个孩子,所有的父母都需要改变。我不希望视图直接从db访问数据,我只希望数据通过控制器传输到视图 问题2:如何在这样的层次结构中将事件从视图传播到控制器? 我正在考虑使用PropertyChangeListener。如果控制器必须执行任何操作,

我正在尝试在swing应用程序中应用MVC模式。然而,我面临两个主要问题,因为你们有嵌套的面板层次结构,例如父->子->孙子->孙子

问题1:当您有这样的层次结构时,如何在控制器和视图之间传输数据?如果我去把数据从父母传给孩子,那么会有很多重复,如果我改变一个孩子,所有的父母都需要改变。我不希望视图直接从db访问数据,我只希望数据通过控制器传输到视图

问题2:如何在这样的层次结构中将事件从视图传播到控制器? 我正在考虑使用PropertyChangeListener。如果控制器必须执行任何操作,视图将显示firePropertyChange事件。控制器将侦听这些事件并执行一些操作。但是,如果我对层次结构执行此操作,则会出现代码重复

我有三个有用的想法:

  • 为每个面板使用控制器,但这样我会得到很多控制器
  • 使用中介设计模式,提供视图和控制器之间的通信
  • 使用一个中央接收器&通知器,它将从视图中侦听所有属性更改事件,并通知感兴趣的控制器。但这只能解决我的第二个问题:
  • 请参考下图,了解第三个创意的图片。如果是第二个,调解人将在中心

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


    我对您的第1期有一个建议:

    您可以拥有一个包含另一个视图模型属性的视图模型。在控制器方法上,您只需要接收父视图模型,因为模型绑定器将为您绑定所有属性

    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; }
    }
    
    它将呈现输入:

    <input type="text" id="Child_Name" name="Child_Name" />
    
    
    
    问题1:在安装时如何在控制器和视图之间传输数据 有这样的等级制度吗?如果我去把数据从父级传递给子级,那么 会有很多重复,如果我改变一个孩子,所有的时间 父母需要改变。我不希望视图直接访问 来自db的数据,我希望数据通过 仅限控制器

    忽略层次结构,通过向相关控制器注册视图来采用更线性的方法如何?数据可以通过一个模型获得,在该模型中,通过
    观察者
    监听者
    模式触发更改

    这样你就不会有任何重复发生。一切都将集中在一个模型或一系列模型中。在用户操作或外部事件发生后,控制器可以在已注册视图的列表上运行notify

    此外,视图绝对不应该像您所说的那样访问数据源。这里应该至少有一层抽象。如果您的控制器使用中介模式,我将通过将请求转发到额外数据层中的接口来处理此问题

    进一步考虑,我不认为通过视图进行注册是一个好主意。所以我会把这分开。手动初始化视图,或者找到一种方法来遍历所需的视图。也许你可以通过一种自动执行这一步骤的工厂来获取你的观点

    问题2:如何以这种方式将事件从视图传播到控制器 等级制度我正在考虑使用PropertyChangeListener。视图将 如果控制器必须执行任何操作,则firePropertyChange事件。 控制器将侦听这些事件并执行一些操作。但是 同样,如果我对层次结构执行此操作,则会出现代码重复

    同样,您可以采用线性方法。注册视图后,控制器可以将其侦听器添加到视图中。或者您可以让视图发送一些语义样式的消息(例如:doAction(“Save”)),这些消息可以通过分派机制处理。将留给您决定如何转发参数

    是否需要PropertyChangeListeners?我是说,你需要那种粒度吗

    我有三个有用的想法:

    为每个面板使用控制器,但以这种方式结束 有很多控制器。使用将 提供视图和控制器之间的通信。使用中央处理器 侦听所有属性更改事件的接收器和通知程序 并将通知感兴趣的控制器。但是这个 只能解决我的第二个问题:

    这听起来有点像。使用这种方法,每个子系统都有模型-视图-控制器三元组。这是一个有趣的想法,但可能很混乱,不清楚层次结构应该如何运作,以及如何实现协调/从属关系

    也许您可以为应用程序的每个模块/子系统提供第四个中立类,在其中插入视图、模型和控制器,如果其中一个丢失或不正确,则抛出异常

    或者,按照中央通知程序的思想,您可以使用一个中央控制器作为路由机制,发送到其他功能特定的控制器或更基本的操作。如何将消息重新路由到这些服务器取决于您。注意线程化,因为集中化将使此类的设计变得至关重要


    无论你做什么,都要尽量让事情变得简单。您应该能够在模型和控制器打开的情况下拥有一个测试视图,而不会有太多麻烦。

    当我最终使用时,我也面临着类似的问题。是的,你是对的,因为会有很多控制器。但它也确实会在代码中为您提供清晰的关注点分离。您可以通过创建一些特定于应用程序的高级组合小部件来限制控制器的数量。在这种情况下,层次结构最多可以限制为2或3级,控制器可以链接到t
    <input type="text" id="Child_Name" name="Child_Name" />