有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Swing中正确的ModelViewController模式

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

  1. 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模式出色地构建了您的代码

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

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

这是我对这件事的看法。我非常期待你的回复和评论


共 (2) 个答案

  1. # 1 楼答案

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

    So the model registers with the view component via a specific Listener interface?

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

  2. # 2 楼答案

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