JList和ListModel设计模式建议

时间:2013-04-10 09:44:22

标签: java list design-patterns jaxb

我正在构建一个应用程序,它基本上只是一个用于显示和编辑单个对象的GUI。由于此对象的类是使用JAXB创建的,因此它基本上是一个包含许多字符串和整数作为子项的树,但也有一些List<E>。对于每个简单的子代,JAXB提供了一个getter和一个setter,但是对于所有列表,只提供了一个getter,因为它提供了对内部列表的引用,现在可以对其进行修改。

由于我需要单独的 swing GUI组件中显示每个孩子(以及分支),我需要这些视图来处理一些数据。根据我目前对模型视图控制器设计模式的了解,我应该严格将模型与视图分开。在此之后,让JList直接在我的基础对象的内部列表上操作是个坏主意。 (实际上这样做对我的特定用例来说是一个非常简单的解决方案,但由于以后可能会添加其他功能,我想我应该避免这个想法。)

然后我开始思考:如果我不让组件直接在列表上工作,我必须让它们使用原始的副本。但由于我无法将原始列表设置为GUI组件返回的新列表,因此在将视图数据保存到模型时,我必须再次复制项目。此外,分发对自定义ListModel的内部列表的引用是不明智的,这意味着,根据GUI结构的深度,列表可能会被复制多次。

由于我也希望我的应用程序高效,这似乎也不是正确的方法。如何“正确”构建这个?

要点:

  • 原始对象的List<E>是对内部列表的引用 对象。

  • 显示列表的JList不应该获得此引用, 因此必须复制清单。

  • JList获取列表不应该产生 也可以引用内部列表,因此必须再次复制。

  • 将列表保存到原始对象必须将列表复制第三个 时间,因为原始对象没有列表的setter方法。 (看到 以上详情)

我对这是正确的把握吗?如何正确构建并使其高效?

P.S:将setter方法添加到原始类结构不是一种选择!

2 个答案:

答案 0 :(得分:1)

  

是使用JAXB创建的,它基本上是一个包含许多字符串的树   整数作为孩子,但也有一些List<E>。对于每一个   简单子JAXB提供了一个getter和一个setter,但适用于所有列表   只提供一个getter,因为它提供了对内部的引用   列表,现在可以修改。

答案 1 :(得分:1)

@mKorbel的所有组件suggested都提供了某种选择侦听器,允许您将一个面板中的选择松散地耦合到另一个面板中的所选项目的显示。 FileBrowser说明TreeSelectionListener; Outline可以有一个ListSelectionListener,显示为here;等

附录:在此相关的example中,DisplayPanel会侦听相邻的TableModel,它可以查询以更新其自己的某个组件中的模型。请注意,每个模型都松散地耦合到其各自的视图。提到了常见的通知机制here