【问题标题】:JList and ListModel design pattern adviceJList 和 ListModel 设计模式建议
【发布时间】:2013-04-10 09:44:22
【问题描述】:

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

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

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

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

总结:

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

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

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

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

我的理解正确吗?如何正确构建它并使其高效?

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

【问题讨论】:

    标签: java list design-patterns jaxb


    【解决方案1】:

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

    见

    【讨论】:

    • 很抱歉造成了这种混乱,但我确实不希望显示一棵树,我只是想说,底层结构是一棵树。我真正需要的是以非常具体的方式显示任何分支或子项。也就是说,我构建了JPanels,包含JTextFields、JTextPanes、JComboBoxes等等……
    • 用附加信息描述问题,存在潜在问题 1. 如果所有数据都加载到内存中 2. 或数据(按需)从外部或内部资源加载 3. 如何存储潜在更改添加/删除/修改树部分的任何元素,4.这个问题与Swing无关,因为GUI的可见值必须存储在内存中
    • 你是对的。我删除了 swing 和 jlist 标签,这应该更清楚,我实际上并没有询问 swing 实现,而是询问了一般设计。为了解决您的问题: 1. 数据完全加载到内存中。 3. 我永远不会删除树的一部分,因为结构是预定义的,但我会修改树中几乎所有字段的值。当用户点击某种保存按钮时,即在程序中的特定时刻,我想存储用户从视图到模型的更改。希望能更好地澄清它!?
    • 未选中,请参阅mvc tag 和observable 的问题,可能有一些关于 的好主意
    • 1. The data is loaded completely into the memory 默认使用xml结构可以模拟嵌入式数据库(如果使用,取决于xml结构例如)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多