我编写了一个包含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>
?
答案 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
方法来处理听众和事件。