Java Swing中正确的ModelViewController模式
我最近开始在Java中使用Swing应用程序,目前主要使用JTables。来自世界各地。NET WPF背景,它是使用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-->;控制器<--&燃气轮机;TableModel:添加另一层以执行逻辑 我们现在将有一个中央控制器来实例化(或在构造函数中接收注入的)视图和模型。此外,它会在视图上注册任何监听器,无论何时发生这种情况,我们都会在模型上调用一些更新方法。也许还有另一种方法是将事件从视图的注册处理程序转发到控制器,但这需要视图了解有关控制器的信息。。。 我猜,当我们调用update方法时,事件返回视图的触发将保留在模型上,除非我们只是在表上调用tableChanged方法。然而,这破坏了事件机制的整体整洁性,它是在TableModel实现中免费提供的。。。 这里必须考虑的其他事项是,每次从视图处理事件时,我们都需要注意从视图索引到模型索引的转换(可能是我目前无法想到的其他考虑事项)
JTable<--&燃气轮机;表格模型-->;业务模型:我们使用TableModel作为协调器,并将我们的业务知识保留在其他地方 到目前为止,我假设TableModel包含原始业务数据,例如以列表的形式。现在,我们可以在TableModel上潜在地使用setValueAt方法+注册处理程序,该处理程序随后将修改底层业务模型,封装列表。 我唯一担心的是TableModel应该是一个模型而不是控制器
这是我对这件事的看法。我非常期待你的回复和评论
# 1 楼答案
为了澄清这一点,Swingseparable model architecture使用observer pattern松散地耦合模型和视图,如here所示。通常^{} 在内部使用,但在here中提到了其他实现。UI委托控制用户与视图的交互。这允许组件在不同的平台上正常工作,正如用户所感觉到的那样
否,每个模型在内部维护一个^{} ;每个对应的视图都通过模型的
addXxxListener()
方法将自己添加为侦听器。大多数组件也使用PropertyChangeLister
作为绑定属性# 2 楼答案
据我所知,Swing MVC模型并没有严格地将视图与模型分开,即两者之间存在一些通信,以避免不必要地通过控制器。在我使用它时,JTable是视图,TableModel是模型,您的监听器充当需要更多控制的事情的控制器,而不仅仅是“显示模型中的内容”