2012-08-03 87 views
2

我最近开始使用Java中的Swing应用程序,目前主要使用JTables。来自.NET WPF背景的世界,这是使用MVVM设计模式构建的巨大架构,我正在与Swing一点点挣扎。原因是,对于JTables,看起来有许多方法可以实现Model-View-Controller模式(至少在查看可用类后我感觉到了什么)。因此,我想分享几种可能的通用方法,这些方法可以通过我的想法以及我目前看到的方式,以及收集有关此问题的意见,这可能适用于其他控件/应用程序:Java Swing中正确的模型 - 视图 - 控制器模式

  1. 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的情况下,结构化你的代码出色

  2. 的JTable - >控制器< - >的TableModel:添加其他层执行逻辑 我们现在将有一个中央控制器,它将实例化(或接收在构造函数中注入的)视图和模型。此外,它将在视图上注册任何监听器,并且每当发生这种情况时,我们会在模型上调用一些更新方法。也许是另一种方法是从视图的注册的处理程序控制器向前事件,但这需要以知道有关控制器... 我猜事件的发射返回查看将保持在模型上,当我们调用update方法时,除非我们简单地在表上调用tableChanged方法。然而,这却破坏了TableModel实现中免费提供的事件机制的整体性... 此处必须考虑的其他事情是,我们需要注意每次处理时从视图索引转换为模型索引>的TableModel - - 从View(我不能在此刻想到的可能是其他因素)

  3. JTable中<事件>商业模式:我们使用的TableModel作为协调和保持我们的商业知识别处 到目前为止我假定TableModel包含原始业务数据,例如以List的形式。现在,我们可以在TableModel上使用setValueAt方法+注册处理程序,随后修改底层BusinessModel,封装List。 我唯一担心的是TableModel 应该是真的是模型而不是控制器。

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

+0

另请参阅[* Swing Architecture Overview *](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod 2012-08-03 12:01:51

+0

辉煌的资源,实际上说在大多数情况下符合版本1我猜 – Bober02 2012-08-03 13:17:51

回答

2

Swing MVC模型,据我所知,它并不严格区分视图和模型,也就是说两者之间有一些沟通以避免不必要地通过控制器。当我使用它时,JTable是视图,TableModel是模型,并且您的听众充当控制器,用于需要更多控制的事情,而不仅仅是'显示模型中的内容'。

+0

我也看到了这种方法,我只是想看看是否有人符合我提出的任何其他建议 – Bober02 2012-08-03 11:38:25

+1

Swing使用的模式将视图和控制器合并成一个对象因此,Swing避免“必然要经过控制器”或您的“听众充当控制器”并非如此。相反,控制器内置于视图中。阅读:http://www.oracle.com/technetwork/java/architecture-142923.html – Jason 2012-12-12 22:53:02

+0

我发现试图将JTable变成严格的MVC范例,导致代码非常混乱。最近是TableModelEvent处理程序的重叠,导致无限循环。我的“控制器”和我的CustomJTable类错误地处理TableModelEvents。我现在将我的应用程序更改为CustomJTable扩展JTable类,它将处理TableModelEvents。然后,我的“控制器”将处理来自应用程序其他部分的影响TableModel,TableView或两者的事件。感谢Bober02和Oracle引用Jason的最初问题。 – bitsdanceforme 2013-03-25 16:41:35

2

只是为了澄清,Swing的separable model architecture夫妇模型和视图松散使用observer pattern,如图所示here。通常EventListenerList在内部使用,但其他实现方式被提及为here。 UI委托控制用户与视图的交互。这允许组件在不同平台上正确工作,正如用户所感知的那样。

因此,该模型通过特定的Listener接口与视图组件注册?

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