RowSorter provides the basis for sorting and filtering.
 Beyond creating and installing a 
RowSorter, you very rarely
 need to interact with one directly.  Refer to
 
TableRowSorter for a concrete
 implementation of 
RowSorter for 
JTable.
 
 RowSorter's primary role is to provide a mapping between
 two coordinate systems: that of the view (for example a
 JTable) and that of the underlying data source, typically a
 model.
 
 The view invokes the following methods on the RowSorter:
 
 toggleSortOrder  The view invokes this when the
     appropriate user gesture has occurred to trigger a sort.  For example,
     the user clicked a column header in a table.
 - One of the model change methods  The view invokes a model
     change method when the underlying model
     has changed.  There may be order dependencies in how the events are
     delivered, so a 
RowSorter should not update its mapping
     until one of these methods is invoked.
  
 Because the view makes extensive use of  the
 
convertRowIndexToModel,
 
convertRowIndexToView and 
getViewRowCount methods,
 these methods need to be fast.
 
 RowSorter provides notification of changes by way of
 RowSorterListener.  Two types of notification are sent:
 
 RowSorterEvent.Type.SORT_ORDER_CHANGED  notifies
     listeners that the sort order has changed.  This is typically followed
     by a notification that the sort has changed.
 RowSorterEvent.Type.SORTED  notifies listeners that
     the mapping maintained by the RowSorter has changed in
     some way.
 
 RowSorter implementations typically don't have a one-to-one
 mapping with the underlying model, but they can.
 For example, if a database does the sorting, 
 
toggleSortOrder might call through to the database
 (on a background thread), and override the mapping methods to return the
 argument that is passed in.
 
 Concrete implementations of RowSorter
 need to reference a model such as TableModel or
 ListModel.  The view classes, such as
 JTable and JList, will also have a
 reference to the model.  To avoid ordering dependencies,
 RowSorter implementations should not install a
 listener on the model.  Instead the view class will call into the
 RowSorter when the model changes.  For
 example, if a row is updated in a TableModel
 JTable invokes rowsUpdated.
 When the model changes, the view may call into any of the following methods:
 modelStructureChanged, allRowsChanged,
 rowsInserted, rowsDeleted and
 rowsUpdated.