3

我目前正在构建一个 Java GUI 应用程序,并且我将要实现一些看似需要大量思考的东西,至少对于像我这样相对缺乏经验的人来说是这样。

情况

如下:我有一个Customer域级别的类,它包含一组作业,它也是一个类(Job)。该应用程序适用于一家虚构的园艺公司,该公司希望管理其客户及其为他们所做的工作。

在 GUI 级别,我为所有客户提供了一个 jList,其自定义列表模型扩展了AbstractListModel. 我的应用程序的这一部分运行良好,我可以轻松地添加/编辑/删除客户,而且应该如此。

目标

现在是实现一个jTable,它应该显示在jList 中选择的客户的工作

毫无疑问,我需要一个 custom TableModel,问题是:从哪里获取数据?需要注意的是,Customer类中作业的集合是一个ArrayList,并且该类没有直接返回这个ArrayList的方法,只能得到一个副本,因为我不希望它可以改变集合在课堂上直接从公共环境中。

我的点子

就是让tablemodel有一个改变内部集合的方法,带一个customer参数。当索引中的索引jList发生变化时,应该调用该方法,以便 jTable 代表Job已为客户完成的 s。当我必须编辑/创建/删除作业时,更改总是首先在 tablemodel上完成,这会将更改传播到customer对象(在新作业或作业删除的情况下)。

问题

这是实现它的好方法吗?我感觉不是Job,因为如果我忘记通过tablemodel对a做任何更改,而直接放在Customeror上Job,就会出现不一致和麻烦。有没有更好的方法?如果它涉及改变其他东西,我不介意。

(可选)小子问题

Collection我对java中的不同s缺乏一些知识。我通常只选择ArrayList,就像在这种情况下Customer(可变)工作一样。有更好的收藏吗?

4

1 回答 1

2

并不是说这是实现这一点的最佳方式,但我会这样做

  • 确保客户工作列表是可观察的。通过使用提供触发事件的集合的第 3 方库(我认为 Google 有一些可用的),或者只是确保Customer更新Job集合的每个方法都会触发事件
  • Job然后,代表某个特定的 s 的表模型Customer可以侦听这些事件并相应地更新自身
  • 目前尚不清楚您是否允许对表格 ui 进行更改,但如果您允许,表格模型应该负责将这些更改再次传播到Customer

因此,您当前的编辑/创建/删除/添加作业代码没有任何变化。那一直与您合作,Customer甚至不知道TableModel存在。该TableModel作品也直接针对,Customer甚至不知道可能有 UI 来编辑/创建/删除/添加作业。它只是侦听对作业集合所做的任何更改并相应地更新自身。

通过表模型对代码的所有部分中的作业列表进行更改似乎是一个非常糟糕的主意。是您的Customer模型,而JTable是视图(MVC 模式任何人)。JTable需要模型(a)的不同表示的事实TableModel是副作用。

于 2012-04-11T16:55:57.090 回答