background image

实现;

 

除了为了触发模型所表示的各种事件方法而提供的 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 组件对模型类的底层实现缺乏了解这一事实。下图说明
了这种典型的关系: