【问题标题】:Java Swing Application with a JTree - MVC Design: Where to position a TreeModel object architecturally?带有 JTree 的 Java Swing 应用程序 - MVC 设计:在架构上将 TreeModel 对象放置在哪里?
【发布时间】: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


【解决方案1】:

我不确定你是否描述了AbstractTreeModel or DefaultTreeModel,我认为这篇文章Understanding the TreeModel 仍然是最好的,并链接到JTree tutorial

为了真正的帮助,您必须编辑您的问题并在 SSCCE 表单中发布您的 headache 的图像,here 是创建 SSCCE 的大量良好基础

【讨论】:

【解决方案2】:

除了@mKorbel 的信息链接和@Shakedown 的评论,考虑使用SwingWorker 定期与您的中间层会合并更新您的TreeModel,也许是为了响应Timer。有一个相关的例子here;请注意,GUI 在查询运行时保持响应。当然,更新需要多久运行一次以及更新 GUI 的频率取决于您的应用程序。

【讨论】:

【解决方案3】:

我明白了这个问题。

我认为 Swing API 出现在我的应用程序模型中不是一个好主意,因为我的应用程序可以采用多种不同类型的 UI(无头、Swing、Web)。

因此,我决定正确的方法是让 TreeModel 对象存在于 View 中,并由 View Helper 填充,该 View Helper 为任何感兴趣的 UI 提供对 Model 层的通用表示的访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多