JavaSwing中正确的模型-视图-控制器模式
我最近开始在Java中使用Swing应用程序,目前主要使用JTables。来自.NETWPF背景的世界,它是使用MVVM设计模式构建的,我在Swing方面有点困难。原因是,对于JTables,似乎有很多方法可以实现模型-视图-控制器模式(至少是我在查看可用类后的感受)。因此,我想分享一些可能的通用方法,这些方法是cmae在我脑海中形成的,也是我迄今为止看到的,并收集您对这个问题的意见,这些意见可能适用于其他控件/应用程序: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:在这种方法中,我们只有一个视图和一个
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模式出色地构建了您的代码这些是我对此事的看法。我非常期待您的回复和评论。据我所知,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