To do filtering you'll need:
A FilterList, a TransformedList that filters elements from a source EventList. As the source changes, FilterList observes the change and updates itself automatically.
An implementation of the Matcher interface, which instructs FilterList whether to include or exclude a given element from the source EventList.
This is all you'll need to do static
filtering - the filtering criteria doesn't ever change. When you need to
do dynamic filtering you'll need a
MatcherEditor. This interface allows you to fire
events each time the filtering criteria changes. The
FilterList responds to that change and notifies
its listeners in turn.
The main difference between Matchers and
MatcherEditors is that
Matchers should be immutable whereas
MatcherEditors can be dynamic. The motivation
for the distinction lies in thread safety. If
Matchers were mutable, filtering threads and
Matcher editing threads could interfere with one another.