我目前正在构建一个Java GUI应用程序,我即将实现一些看似需要大量思考的东西,至少对于像我这样经验相对缺乏的人来说。
如下:我在域级别有一个类Customer
,它包含一组作业,也是一个类(Job
)。该应用程序适用于一家想要管理其客户及其为他们所做的工作的虚构园艺公司。
在GUI级别,我为所有客户提供了一个jList,其中包含一个扩展AbstractListModel
的自定义列表模型。我的应用程序的这部分工作完美,我可以轻松地添加/编辑/删除客户。
现在要实现一个 jTable ,它应该显示在jList中选择的客户的作业。
毫无疑问,我需要自定义TableModel
,问题是:从何处获取数据?应该注意的是Customer
类中的作业集合是ArrayList
,并且该类没有直接返回此ArrayList 的方法,它只能获得一个副本,因为我不希望它可以直接从公共上下文中改变类中的集合。
是否让tablemodel有一个方法来更改内部集合,并带有customer
参数。当jList
中的索引发生更改时,应调用该方法,以便jTable表示已为客户完成的Job
。
当我必须编辑/创建/删除作业时,更改始终先在 tablemodel 上完成,会将更改传播到{{1} } object (如果是新工作或删除工作)。
这是实施它的好方法吗?我感觉它不是,因为如果我忘记通过tablemodel对customer
进行任何更改,直接在Job
或Customer
上进行更改不一致和麻烦。还有更好的方法吗?如果它涉及改变其他东西,我不介意。
我对java中的不同Job
缺乏一些了解。我通常只使用Collection
,就像ArrayList
中的(可变)作业一样。有没有更好的收藏?
答案 0 :(得分:2)
不是说这是实现这一目标的最佳方法,但这就是我要做的事情
Customer
集合的Job
上的每个方法触发事件Job
的{{1}}的表模型可以侦听这些事件并相应地更新自己Customer
因此,您当前的编辑/创建/删除/添加工作代码没有任何变化。这与您的Customer
保持一致,甚至不知道Customer
存在。 TableModel
也直接针对TableModel
,甚至不知道可能有用户编辑/创建/删除/添加作业。它只是监听对作业集合所做的任何更改并相应地更新自己。
通过表模型对代码的所有部分中的作业列表进行更改似乎是一个非常糟糕的主意。 Customer
是您的模型,Customer
是视图(任何人都可以使用MVC模式)。 JTable
需要不同的模型表示(JTable
)这一事实是副作用。