模型过滤器是实现了模型接口、但并不真正包含数据的类。模型过滤器在组件与其模型之
间进行协调。模型过滤器可以重新解释模型所提供的信息,并且可以更改所提供的数据元
素个数、数据的顺序以及数据本身。
在本例中,过滤器类是将一个现有模型类作为其数据源来实例化的。在模型过滤器的
一般实现中,对 API 方法的调用将委托给源模型。
由于此 API
“
”
是统一实现的,因此完全可以在组件与其模型之间 叠放 多个过滤器。
注意,每个过滤层都要求每个 API 调用穿过一个附加的间接层;如果过滤层过于复杂,则
很可能造成性能瓶颈。
基本过滤器
下面显示的抽象类是作用于 JList 组件之上的模型过滤器的基类。其唯一的构造函数
要求,模型过滤器的每个实例都要引用某个底层的模型数据。该数据既可以是另一个模型
过滤器,也可以不是;在这两种情况下,过滤器的行为是相同的。
模型过滤器基类
1
package
com.ketherware.models;
2
import
javax.swing.*;
3
public
abstract
class
AbstractListModelFilter
extends
AbstractListModel
4
{
5
//
用来保存被过滤模型的引用
6
protected
ListModel delegate;
7
//
构造函数 ― 接受单个参数,其中包含被过滤模型的引用
8
public
AbstractListModelFilter(ListModel delegate)
9
{
10
this
.delegate = delegate;
11
}
12
public
ListModel getDelegate()
13
{
14
return
this
.delegate;
15
}
16
public
int
getSize()
17
{
18
//
委托给过滤器目标
19
return
delegate.getSize();
20
}
21
public
Object getElementAt(
int
index)
22
{