background image

 
模型过滤器是实现了模型接口、但并不真正包含数据的类。模型过滤器在组件与其模型之
间进行协调。模型过滤器可以重新解释模型所提供的信息,并且可以更改所提供的数据元
素个数、数据的顺序以及数据本身。
  在本例中,过滤器类是将一个现有模型类作为其数据源来实例化的。在模型过滤器的

 

一般实现中,对 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

    {