实现;
除了为了触发模型所表示的各种事件方法而提供的 protected 方法之外,这通常是一
种不完全的正则实现。所有模型都有一个缺省实现,并且是一个具体类。
既好又简单 ― ListModel 接口
在开始讨论过滤之前,对典型的模型接口作一回顾不失为明智之举。
ListModel
接口代表 JList 组件中的数据。这是三种集合模型中最简单的一种。(另外两
种分别是 JTree
和 JTable。) ListModel 有两个方法用于检索列表中的元素个数以及各个元
素,另外还有两个方法用于维护感兴趣的监听程序列表,以便监听列表模型的变化。
ListModel 的简化源代码
1
package
javax.swing;
2
import
javax.swing.event.ListDataListener;
3
public
interface
ListModel
4
{
5
int
getSize();
6
Object getElementAt(
int
index);
7
void
addListDataListener(ListDataListener listener);
8
void
removeListDataListener(ListDataListener listener);
9
}
10
在 ListModel
接口中, getSize()
与 getElementAt() 方法用于遍历模型中的元素,而其
他两个方法用于建立与感兴趣的监听程序之间的关联,以便监听模型的变化。
ListDataListener 接口支持三个方法,当模型监听到其底层数据发生变化时就会调用
这三个方法。这三个方法是 intervalAdded()
、 intervalRemoved()
和 contentsChanged() ,每
个方法都接受单个 ListDataEvent 作为参数。根据模型所发生变化的复杂程度之不同,模
型 实 现 可 以 使 用 其 中 的 任 一 个 方 法 来 描 述 这 些 变 化 。 通 常 , intervalAdded() 和
intervalRemoved() 用于描述变化的时间间隔;当变化过于复杂,无法作为一个闭合间隔进
行描述时,就会用到 contentsChanged() 。
为了理 解模型过滤如何运作,请记住这一点: JList
组件只对 ListModel API 的实现
感兴趣。该组件并不关心数据驻留何处以及数据是如何组织的。无论该模型是一个缺省类、
抽象类的扩展,还是 ListModel
接口的一种直接实现,都不影响 JList 组件的行为。
模型过滤的基本概念利用了 Swing 组件对模型类的底层实现缺乏了解这一事实。下图说明
了这种典型的关系: