JavaSwing中正确的模型-视图-控制器模式

JavaSwing中正确的模型-视图-控制器模式,java,swing,model-view-controller,design-patterns,jtable,Java,Swing,Model View Controller,Design Patterns,Jtable,我最近开始在Java中使用Swing应用程序,目前主要使用JTables。来自.NETWPF背景的世界,它是使用MVVM设计模式构建的,我在Swing方面有点困难。原因是,对于JTables,似乎有很多方法可以实现模型-视图-控制器模式(至少是我在查看可用类后的感受)。因此,我想分享一些可能的通用方法,这些方法是cmae在我脑海中形成的,也是我迄今为止看到的,并收集您对这个问题的意见,这些意见可能适用于其他控件/应用程序: JTable TableModel:在这种方法中,我们只有一个视图和一个

我最近开始在Java中使用Swing应用程序,目前主要使用JTables。来自.NETWPF背景的世界,它是使用MVVM设计模式构建的,我在Swing方面有点困难。原因是,对于JTables,似乎有很多方法可以实现模型-视图-控制器模式(至少是我在查看可用类后的感受)。因此,我想分享一些可能的通用方法,这些方法是cmae在我脑海中形成的,也是我迄今为止看到的,并收集您对这个问题的意见,这些意见可能适用于其他控件/应用程序:

  • JTable TableModel:在这种方法中,我们只有一个视图和一个模型。 TableModel提供了一些有用的更新方法,例如setValueAt,在这些方法中,您可以放置任何UI更新的处理代码,而这反过来又可以引发模型更新事件。我猜这是DefaultTableModel的默认实现。所以模型处理直接在单元格(数据)上进行的更新。 视图(JTable)将在用作视图的类的代码隐藏中注册任何其他处理程序。代码可能如下所示:

    类视图扩展了JPanel{

    public View(TableModel model) {
        super(new BorderLayout(1, 0));
        JTable table = new JTable(model) {
    
            //override anything you need here - renderers etc.
    
        };
    
        //add any listeners here
    }
    //Listeners that would perform actions on events, and possibly call model to update
    
    我喜欢的是,我们只有两个地方可以放入代码,实现中提供的JTable和TableModel之间有一种自然的联系,即setValueAt方法。 然而,在我看来,我讨厌的是完全无视MVC模式,在MVVM的情况下,MVC模式出色地构建了您的代码

  • JTable-->Controller TableModel:添加另一层以执行逻辑 我们现在将有一个中央控制器来实例化(或在构造函数中接收注入)视图和模型。此外,它会在视图上注册任何侦听器,每当发生这种情况时,我们都会在模型上调用一些更新方法。也许还有另一种方法是将事件从视图的注册处理程序转发到控制器,但这需要视图了解控制器。。。 我猜当我们调用update方法时,事件的触发返回视图将保留在模型上,除非我们简单地调用表上的tableChanged方法。然而,这破坏了事件机制的整体整洁性,在TableModel实现中免费提供了事件机制。。。 这里必须考虑的其他事项是,每次从视图处理事件时,我们都需要注意从视图索引到模型索引的转换(可能还有其他我目前无法想到的考虑)

  • JTable TableModel-->业务模型:我们使用TableModel作为协调器,并将业务知识保存在其他地方 到目前为止,我假设TableModel包含原始业务数据,例如以列表的形式。现在我们可以在TableModel上潜在地使用setValueAt方法+register处理程序,该处理程序随后将修改底层业务模型,封装列表。 我唯一担心的是TableModel实际上应该是一个模型,而不是控制器


  • 这些是我对此事的看法。我非常期待您的回复和评论。

    据我所知,Swing MVC模型并没有严格地将视图与模型分开,即两者之间存在一些通信,以避免不必要地通过控制器。在我使用它时,JTable就是视图,TableModel就是视图模型,你的监听器作为控制器处理需要更多控制的事情,而不仅仅是“显示模型中的内容”。

    据我所知,Swing MVC模型并没有严格地将视图与模型分开,即两者之间存在一些通信,以避免不必要地通过控制器。在我使用它时,JTable是视图,TableModel是模型,您的监听器作为控制器处理需要更多控制的事情,而不仅仅是“显示模型中的内容”。

    为了澄清这一点,Swing使用松散地耦合模型和视图,如图所示。通常在内部使用,但也提到了其他实现。UI委托控件ls用户与视图的交互。这允许组件在不同的平台上正常工作,正如用户所感觉到的那样

    因此,模型通过特定的
    侦听器
    接口向视图组件注册


    不,每个模型都在内部维护一个侦听器;每个对应的视图通过模型的
    addXxxListener()添加自己作为侦听器
    方法。大多数组件也使用
    PropertyChangeLister
    来绑定属性。

    为了澄清,Swing使用松散地耦合模型和视图,如图所示。通常在内部使用,但也提到了其他实现。UI委托控制用户与视图的交互。这允许组件正如用户所感知的那样,在不同的平台上正确地工作

    因此,模型通过特定的
    侦听器
    接口向视图组件注册


    不,每个模型都在内部维护一个侦听器;每个对应的视图通过模型的
    addXxxListener()添加自己作为侦听器
    方法。大多数组件也使用
    PropertyChangeLister
    作为绑定属性。

    我也看到了这种方法,我只是想看看是否有人符合我提出的任何其他建议Swing使用的模式将视图和控制器组合到一个对象中。因此,Swing并不是在回避这种情况“必须通过控制器”或“监听器充当控制器”。相反,控制器内置于视图中。阅读:我发现,试图将JTable引入严格的MVC范型会导致非常混乱的代码。最近是TableModelEvent处理程序的重叠,导致无限循环。我的“控制器”“我的CustomJTable类错误地处理了TableModelEvents。我现在将我的应用程序更改为Cu