【问题标题】:How do I turn a Java Deque<T> into a DefaultListModel?如何将 Java Deque<T> 转换为 DefaultListModel?
【发布时间】:2023-03-23 17:41:02
【问题描述】:

我编写了一个包含Deque&lt;T&gt; 的类(我们称之为Model.java),其中包含用于使项入队和出队的方法。现在我试图将它与 GUI JList 联系起来。我很困惑如何以某种方式使用我的“模型”数据——双端队列——作为 JList 想要的 DefaultListModel。我仍在努力真正获得 OO 概念,因为它们适用于 GUI 编程。 DefaultListModel 文档状态:

这个类松散地实现了 java.util.Vector API,因为它实现了 1.1.x 版本的 java.util.Vector,没有集合类支持,并在发生变化时通知 ListDataListeners。目前它委托给一个 Vector ....

有没有办法让 DefaultListModel 使用我的 Deque&lt;T&gt; 而不是 Vector,从而允许我的 Model.java 代码基本保持不变,同时免费提供所有侦听/通知行为?还是我必须重写 Model.java 以使用 DefaultListModel 而不是 Deque&lt;T&gt;

【问题讨论】:

  • +1 很好的初学者问题。欢迎来到 SO!

标签: java containers defaultlistmodel


【解决方案1】:

请注意,JList 构造函数采用ListModel(接口),而不是DefaultListModel(实现)。这是一个 OO 原则(合同),指定 JList 可以使用任何碰巧实现 ListModel 接口的对象。来自Object Oriented Programming Concepts上的Java教程:

接口是类与外部世界之间的契约。什么时候 一个类实现了一个接口,它承诺提供行为 由该接口发布。

由于ListModel 只有四个方法,你的类应该很容易实现它们并将操作委托给你的内部Deque。你的类应该被声明为

public class Model implements ListModel
{
     ....

并将包含四个实现ListModel 方法的附加方法。这些实现可以在幕后做任何你需要的事情,但必须遵守ListModel 的定义以及JavaDoc 中ListModel 合同中指定的任何行为。

完成此操作后,您可以构造一个JList,将您的类Model 的实例传递给构造函数。

【讨论】:

  • 谢谢 - 这很有帮助。这是否真的意味着,只要我提供一个 AddListDataListener() 方法,我就不需要关心决定何时或如何“告诉”听众我的 Deque 发生了重大变化?
  • 好的 - 我将我的模型类声明为实现 ListModel,并插入了四个方法存根。 getSize() 和 getElementAt() 很容易实现,但我不知道 addListDataListener() 该怎么做,所以我把它留空了。因此,虽然我能够向我的双端队列添加一个对象,然后再检索它,但它并没有出现在 GUI 中。阅读文档,我发现将 ListDataEvents 发送到 ListDataListeners 是我的责任。所以我假设我实际上必须实现 another 列表,只是为了保存和遍历我的 Listeners?并在我更改内容时向他们发送事件?哇。
  • 是的,就是这样。如果您的类没有扩展任何其他内容,则可以改为扩展 DefaultListModel(这将自动为您提供 implements ListModel),然后将侦听器处理委托给它。如果默认实现与您的类所做的其他一切兼容,只需将这些方法完全排除在您的类之外,超类实现就会被调用。但是,您仍然需要通知听众发生变化。
  • 我采纳了@trashgod 和@Chris 的建议并实现了AbstractListModel,并在我排队一个新项目后插入了对fireIntervalAdded() 的调用。 它有效! 一个好奇心是调用getSize() 的次数——例如,在调用addListDataListener() 之后,JList(或某人)快速连续调用getSize() 45 次!这是意料之中的吗?
  • @Chap:是的,BasicListUI 经常调用getSize() 来建立视图几何。
【解决方案2】:

对于JList,您不必必须使用DefaultListModel,只是ListModel 接口的一些实现。后者使用Deque 非常容易实现。

【讨论】:

    【解决方案3】:

    我不知道为addListDataListener()做什么

    AbstractListModel 可能是一个很好的起点,因为它已经实现了规定的EventListenerList 方法来处理侦听器和事件。

    【讨论】:

    • 这对我来说确实是最好的方法,作为一个初学者。它提请注意EventListenerList 的存在以及通知听众的过程,而无需我一开始就实施这些细节。
    猜你喜欢
    • 2021-04-28
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2013-08-12
    • 2016-02-29
    • 2019-06-13
    相关资源
    最近更新 更多