2

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

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

我将实现 MVC 设计,以允许开发新的视图以与服务器一起使用。

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

我理解 Client 和 TreeModel 的链接方式没有问题:我已经建立了 TreeModelListener 来查看 TreeModel 的更改。如果 TreeModel 对象发生变化,我通过调用它的 treeHasChanged() 方法来重绘 JTree。

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

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

我可能应该注意到,最近几天我一直在考虑观察者和听众,所以我可能对试图在观察者开火后调用行为发生感到内疚。

你的,很迷茫!

4

3 回答 3

2

我不确定您描述的是AbstractTreeModel 还是 DefaultTreeModel,我认为这篇文章 Understanding the TreeModel仍然是最好的,并链接到JTree 教程

为了真正帮助您编辑您的问题并headacheSSCCE表单中发布您的图像,这里有大量创建的良好基础SSCCE

于 2011-11-25T17:58:04.720 回答
2

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

于 2011-11-25T19:05:43.513 回答
0

我明白了这个问题。

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

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

于 2011-12-05T18:06:35.317 回答