如何将Java Deque <t>转换为DefaultListModel?</t>

时间:2011-07-18 01:52:24

标签: java containers defaultlistmodel

我编写了一个包含Deque<T>的类(我们称之为Model.java),其中包含用于对项进行入队和出列的方法。现在我想把它绑定到GUI JList。我对如何以某种方式使用我的“模型”数据 - Deque - 作为JList想要的DefaultListModel感到困惑。我仍然在努力真正获得OO概念,因为它们适用于GUI编程。 DefaultListModel文档说明:

  

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

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

3 个答案:

答案 0 :(得分:5)

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

  

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

由于ListModel只有四种方法,因此您的类应该很容易实现它们并将操作委托给内部Deque。你的班级应该被宣布为

public class Model implements ListModel
{
     ....

并将包含四个实现ListModel方法的其他方法。这些实现可以完成您需要的任何内容,但必须遵守ListModel的定义以及在JavaDoc中指定为ListModel契约的一部分的任何行为。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

我不知道该为addListDataListener()

做些什么

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