我最近开始使用Java中的Swing应用程序,目前主要使用JTables。来自.NET WPF背景的世界,这是使用MVVM设计模式构建的巨大架构,我正在与Swing一点点挣扎。原因是,对于JTables,看起来有许多方法可以实现Model-View-Controller模式(至少在查看可用类后我感觉到了什么)。因此,我想分享几种可能的通用方法,这些方法可以通过我的想法以及我目前看到的方式,以及收集有关此问题的意见,这可能适用于其他控件/应用程序:Java Swing中正确的模型 - 视图 - 控制器模式
JTable < - > TableModel:在这种方法中,我们只有某种意义上的视图和模型。 TableModel具有更新的有用方法,例如setValueAt,您可以在其中放置任何UI更新的处理代码,然后可以在Model更新上引发事件。我想这是DefaultTableModel的默认实现。所以模型处理直接在单元格(数据)上进行的更新。 视图(JTable)将在可用作View的类的后面的代码中注册任何进一步的处理程序。代码看起来是这样的:
类视图扩展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的情况下,结构化你的代码出色
的JTable - >控制器< - >的TableModel:添加其他层执行逻辑 我们现在将有一个中央控制器,它将实例化(或接收在构造函数中注入的)视图和模型。此外,它将在视图上注册任何监听器,并且每当发生这种情况时,我们会在模型上调用一些更新方法。也许是另一种方法是从视图的注册的处理程序控制器向前事件,但这需要以知道有关控制器... 我猜事件的发射返回查看将保持在模型上,当我们调用update方法时,除非我们简单地在表上调用tableChanged方法。然而,这却破坏了TableModel实现中免费提供的事件机制的整体性... 此处必须考虑的其他事情是,我们需要注意每次处理时从视图索引转换为模型索引>的TableModel - - 从View(我不能在此刻想到的可能是其他因素)
JTable中<事件>商业模式:我们使用的TableModel作为协调和保持我们的商业知识别处 到目前为止我假定TableModel包含原始业务数据,例如以List的形式。现在,我们可以在TableModel上使用setValueAt方法+注册处理程序,随后修改底层BusinessModel,封装List。 我唯一担心的是TableModel 应该是真的是模型而不是控制器。
这些是我对这件事的看法。我非常期待你的回复和评论。
另请参阅[* Swing Architecture Overview *](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod 2012-08-03 12:01:51
辉煌的资源,实际上说在大多数情况下符合版本1我猜 – Bober02 2012-08-03 13:17:51