我目前正在构建一个 Java GUI 应用程序,我将要实现一些似乎需要大量思考的东西,至少对于像我这样相对缺乏经验的人来说是这样。
情况
如下:我在域级别有一个类 Customer
,它包含作业的集合,这也是一个类 (Job
)。该应用程序适用于一家虚构的园艺公司,该公司希望管理其客户及其为客户所做的工作。
在 GUI 级别,我为所有客户提供了一个 jList,其中包含一个扩展 AbstractListModel
的自定义列表模型。我的应用程序的这一部分工作得很好,我可以轻松地添加/编辑/删除客户。
目标
现在要实现一个 jTable,它应该显示 在 jList 中选择的客户的工作。
毫无疑问,我需要一个自定义的 TableModel
,问题是:从哪里获取数据?需要注意的是,Customer
类中的作业集合是一个ArrayList
,该类没有直接返回这个ArrayList的方法,只能获得一个副本,因为我不希望直接从公共(public)上下文中改变类中的集合。
我的想法
就是让tablemodel有一个改变内部集合的方法,有一个customer
参数。当 jList
中的索引发生变化时,应调用该方法,以便 jTable 表示已为客户完成的 Job
。
当我必须编辑/创建/删除一项工作时,更改总是首先在表模型上完成,这将将更改传播给客户
对象(在新工作或工作被移除的情况下)。
问题
这是实现它的好方法吗?我觉得不是,因为如果我忘记通过表模型以及Customer
或 对
,会有不一致和麻烦。有更好的方法吗?如果涉及更改其他内容,我不介意。Job
进行任何更改直接Job
(可选)小子问题
我对 java 中的不同 Collection
缺乏一些了解。我通常只使用 ArrayList
,就像在这种情况下在 Customer
中用于(可变)作业。有更好的 Collection 吗?
最佳答案
不是说这是最好的实现方式,但我会这样做
- 确保客户工作列表是可见的。通过使用提供触发事件集合的第 3 方库(我认为 Google 有一些可用的),或者只是确保
Customer
上更新Job
的每个方法收集火灾事件 - 代表某个
Customer
的Job
的表模型然后可以监听这些事件并相应地更新自身 - 尚不清楚您是否允许对表 ui 进行更改,但如果允许,表模型应负责将这些更改再次传播给
Customer
因此您当前的编辑/创建/删除/添加作业代码没有任何变化。这会一直与您的 Customer
合作,甚至不知道 TableModel
的存在。 TableModel
也直接针对 Customer
工作,甚至不知道可能有 UI 来编辑/创建/删除/添加作业。它只是监听对作业集合所做的任何更改并相应地更新自身。
通过表模型对代码所有部分中的作业列表进行更改似乎是一个非常糟糕的主意。 Customer
是您的模型,JTable
是 View (MVC 模式任何人)。 JTable
需要模型的不同表示(TableModel
)这一事实是一种副作用。
关于多组数据的Java表模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110363/