3

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

此类松散地实现了 java.util.Vector API,因为它实现了 1.1.x 版本的 java.util.Vector,不支持集合类,并在发生更改时通知 ListDataListener。目前它委托给一个 Vector ....

有什么方法可以让 DefaultListModel 使用 myDeque<T>而不是 Vector,从而允许我的 Model.java 代码基本保持不变,同时免费提供所有侦听/通知行为?还是我必须重写 Model.java 以使用 DefaultListModel 而不是Deque<T>

4

3 回答 3

5

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

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

由于ListModel只有四个方法,因此您的类应该很容易实现它们并将操作委托给您的 internal Deque。您的课程应声明为

public class Model implements ListModel
{
     ....

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

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

于 2011-07-18T02:19:44.420 回答
1

因为JList,你不必使用DefaultListModel,只是ListModel接口的一些实现。后者使用Deque.

于 2011-07-18T01:58:35.430 回答
1

我不知道该怎么办addListDataListener()

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

于 2011-07-18T05:54:38.527 回答