采用JTree-MVC设计的Java Swing应用程序:在架构上将TreeModel对象定位在何处?

采用JTree-MVC设计的Java Swing应用程序:在架构上将TreeModel对象定位在何处?,java,model-view-controller,swing,jtree,treemodel,Java,Model View Controller,Swing,Jtree,Treemodel,请原谅这个问题的冗长,因为在写这个问题时,我正试图思考我的设计问题 我继承了一个Swing应用程序,它需要重新构建为RMI应用程序。客户要求Swing GUI在本地运行,并通过RMI与远程服务器进程通信,远程服务器进程包含一个控制器类,该类在EventListeners的刺激下将调用定向到业务逻辑部分和后端数据库持久性,从而弥合Swing客户机和控制器之间的差距 我将实现一个MVC设计,以允许开发用于服务器的新视图 目前,Swing客户端GUI包含一个JTree,该JTree使用DefaultT

请原谅这个问题的冗长,因为在写这个问题时,我正试图思考我的设计问题

我继承了一个Swing应用程序,它需要重新构建为RMI应用程序。客户要求Swing GUI在本地运行,并通过RMI与远程服务器进程通信,远程服务器进程包含一个控制器类,该类在EventListeners的刺激下将调用定向到业务逻辑部分和后端数据库持久性,从而弥合Swing客户机和控制器之间的差距

我将实现一个MVC设计,以允许开发用于服务器的新视图

目前,Swing客户端GUI包含一个JTree,该JTree使用DefaultTreeModel填充。此模型使用DefaultMutableTreeNode对象构建,这些对象通过位于这些对象和我的数据源之间的BusinessObject映射器填充业务对象状态

我完全理解客户机和TreeModel是如何链接的:我已经建立了一个TreeModelListener来查看对TreeModel的更改。如果TreeModel对象发生更改,我将通过调用其treeHasChanged()方法重新绘制JTree

然而,我很头痛,试图想象什么过程会刺激TreeModel,以便用数据库中的最新数据重新填充它的内容,这反过来会调用我的TreeModelListener来更新GUI的Jtree。谁应该“拥有”树模型?它应该是模型中的一个类,它构成控制器状态的一部分吗?GUI的EventListeners在控制器中的操作是否应该进行硬调用以运行例程来刷新TreeModel

或者,树模型是GUI小部件的扩展,在这种情况下,它是一个视图组件?如果是这样,调用该对象状态刷新的正确方式是什么

我可能应该注意到,最近几天我一直在从观察者和听众的角度思考问题,因此我很可能对试图在观察者背后引发行为感到内疚


你的,很困惑

我不确定您是否描述了,我认为这篇文章仍然是最好的,并链接到


<> > ReAL帮助您编辑您的问题,并将您的“代码<头痛/代码>”的表单编辑成表格,为创建<代码> SSCCE

提供了很好的基础,除了@ MKOBEL的信息链接和@ SeaCubon的评论外,还考虑使用与您的中间层周期性的重排,并更新您的<代码> TeeMod OD/<代码>,也许是为了回应一个问题。有一个相关的例子;请注意,GUI在查询运行时保持响应。当然,这取决于您的应用程序需要运行更新的频率以及您更新GUI的频率

我把注意力集中在这个问题上

我认为在我的应用程序模型中出现SwingAPI是个坏主意,因为我的应用程序可以使用多种不同类型的UI(Headless、Swing、Web)


因此,我决定正确的方法是让TreeModel对象存在于视图中,并由视图帮助器填充,该帮助器提供对任何感兴趣的UI的模型层的通用表示的访问。

我建议一步一步地解决问题,然后返回到重构和简化/清理;您可以担心听众,并在以后不断更新内容。首先,如果您有一个后端数据库要在
JTree
中公开,我首先要创建一个
TreeModel
,它只做这一点。模型永远不应该是GUI小部件-这就是为什么它是一个模型而不是一个视图。如果TreeModel对象发生更改,我将通过调用其treeHasChanged()方法重新绘制JTree。听起来很可疑,如果模型实现/使用正确,则无需手动重画。通常,您需要xxModelListeners来触发xxView@kleopatra-treeModelListener方法调用treeHasChanged()。经过一夜的睡眠,我相信我的问题有两个:(1)-在我的应用程序的MVC包中,TreeModel应该在哪里运行?(2) 应该如何调用它以更改树模型的状态?如果树模型发生更改,侦听器已经就位,可以重新绘制GUI树。这个Q的动机是不需要通过RMI公开模型BO以直接重新加载GUI。我想我需要像ViewHelper这样的东西,但是xxxModel swing类混淆了体系结构?目前我在模型中引用了TreeModel。我在数据库映射器对象中创建了一个方法,它返回一个完全填充的树模型。我的应用程序的控制器包含一个TreeModel,每当调用创建新数据的操作时,都会使用此方法重新加载该TreeModel。我已将GUI的侦听器订阅到控制器的TreeModel。这是可行的,但感觉是错误的-然而,另一种选择似乎是控制器操作更新位于视图中的TreeModel实例…但是根据MVC,控制器不应该联系视图-只有相反的方式?我开始怀疑我是否误解了MVC图中视图和模型之间的直接联系。虽然我读过一些文章,建议控制器不必是“数据警察”,但我看不出在没有控制器参与的情况下,一个操作如何告诉视图刷新。某个类必须包含一个属性(treemodel),我的视图可以监视该属性的更改。也许我的问题比Java Swing更基本,并且由于我使用Swing的xxxModel对象而变得复杂,因为Swing by design本身不是MVC+1。请参见。可能理解树模型。很难说他/她在寻找什么,看起来像是采访,而不是问题,+1这很有意义;另见。