【发布时间】:2012-01-06 13:00:41
【问题描述】:
请原谅这个问题的冗长,因为在写它时我正在尝试思考我的设计问题!
我继承了一个 Swing 应用程序,它需要重新构建到 RMI 应用程序中。客户要求 Swing GUI 在本地运行并通过 RMI 与远程服务器进程通信,该进程包含一个 Controller 类,该类在 EventListeners 的刺激下将调用定向到业务逻辑和后端数据库持久性部分,从而弥合了 Swing 客户端之间的差距和控制器。
我将实现 MVC 设计,以允许开发新的视图以供服务器使用。
目前,Swing 客户端 GUI 包含一个使用 DefaultTreeModel 填充的 JTree。该模型是使用 DefaultMutableTreeNode 对象构建的,这些对象通过位于这些对象和我的数据源之间的 BusinessObject 映射器填充了业务对象状态。
我完全理解 Client 和 TreeModel 的链接方式:我已经建立了一个 TreeModelListener 来查看 TreeModel 的变化。如果 TreeModel 对象发生变化,我会通过调用它的 treeHasChanged() 方法来重绘 JTree。
但是,我很难想象哪个进程会刺激 TreeModel,以便用数据库中的最新数据重新填充其内容,这反过来又会调用我的 TreeModelListener 来更新我的 GUI 的 Jtree。谁应该“拥有”TreeModel?它应该是构成控制器状态的模型中的一个类吗? GUI 的 EventListeners 在 Controller 中的 Actions 是否应该硬调用来运行例程以刷新 TreeModel?
或者,TreeModel 是 GUI Widget 的扩展,在这种情况下它是 View 组件?如果是这样,调用此对象状态刷新的正确方式是什么?
我可能应该注意到,最近几天我一直在考虑观察者和监听者,所以我可能对试图在观察者开火后调用行为发生感到内疚。
你的,很困惑!
【问题讨论】:
-
我建议一步一步搞清楚,然后再回去重构和简化/清理;您可以担心听众并在以后保持更新。首先,如果您有一个想要在
JTree中公开的后端数据库,我将首先创建一个仅执行此操作的TreeModel。模型不应该是 GUI 小部件 - 这就是为什么它是模型而不是视图。 -
如果 TreeModel 对象发生变化,我会通过调用它的 treeHasChanged() 方法重绘 JTree。 听起来很可疑,如果模型被正确实现/使用,则无需手动重绘。通常,您需要 xxModelListeners 来触发 xxView outside 的其他内容
-
@kleopatra - treeModelListener 方法调用 treeHasChanged()。经过一夜的睡眠后,我相信我的问题有两个:(1) - TreeModel 应该存在于我的应用程序的 MVC 包中的哪个位置? (2) 应该如何调用它来改变 TreeModel 的状态?如果 TreeModel 发生更改,侦听器已经准备好重新绘制 GUI 树。这个 Q 的动机是不需要通过 RMI 公开模型 BO 以直接重新加载 GUI。我想我需要像 ViewHelper 这样的东西,但 xxxModel swing 类会混淆架构?
-
目前我在模型中引用了 TreeModel。我在我的 Database Mapper 对象中创建了一个方法,该方法返回一个完全填充的 TreeModel。我的应用程序的 Controller 包含一个 TreeModel,每当调用创建新数据的 Action 时,它就会使用此方法重新加载。我已将 GUI 的侦听器订阅到控制器的 TreeModel。这可行,但感觉不对 - 但是替代方法似乎是控制器操作更新位于视图中的 TreeModel 实例......但根据 MVC,控制器不应该联系视图 - 只能反过来?
-
我开始怀疑我是否误解了 MVC 图中视图和模型之间的直接联系。虽然我读过一些文章,建议控制器不必是“数据警察”,但我看不出在没有控制器参与的情况下,一个动作如何告诉视图刷新。某处的类必须包含我的视图可以监视更改的属性(树模型)。也许我的问题比 Java Swing 更基本,并且由于我使用 Swing 的 xxxModel 对象而变得复杂,因为 Swing 的设计本身并不是 MVC
标签: java model-view-controller swing jtree treemodel