0

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

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

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

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

概括:

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

  • 显示JList列表不应该得到这个引用,因此它必须复制列表。

  • 从 中获取列表JList也不应该产生对内部列表的引用,因此必须再次复制它。

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

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

PS:在原始类结构中添加setter方法不是一种选择!

4

2 回答 2

1

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

于 2013-04-10T10:01:24.587 回答
1

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

附录:在这个相关示例中,DisplayPanel监听一个相邻TableModel的,它可以查询它以更新它自己的组件之一中的模型。请注意,每个模型都松散地耦合到其各自的视图。这里提到了常见的通知机制。

于 2013-04-10T10:18:13.983 回答