javax.swing

接口
异常
java.lang.Object
  继承者 javax.swing.RowSorter<M>
类型参数:
M - 底层模型的类型
直接已知子类:
DefaultRowSorter

public abstract class RowSorter<M>
     
extends Object

RowSorter 提供排序和过滤的基础。创建和安装了 RowSorter 之后,您几乎不需要直接与它交互。有关 JTableRowSorter 具体实现,请参阅 TableRowSorter

RowSorter 的主要功能在于,提供两个坐标系统之间的映射关系:视图的映射关系(例如 JTable)和底层数据源(通常是模型)的映射关系。

视图调用 RowSorter 的以下方法:

  • toggleSortOrder — 当发生了触发排序操作的恰当用户行为时,视图调用此方法。例如,用户在表中单击列标题时。
  • 其中一个模型更改方法 — 当底层模型发生了更改时,视图调用一个模型更改方法。由于在如何交付事件方面可能存在顺序依赖关系,因此在调用这些方法之一之前 RowSorter 不应该更新其映射关系。
因为视图大量使用了 convertRowIndexToModelconvertRowIndexToViewgetViewRowCount 方法,所以这些方法需要很快的运行快速。

RowSorter 通过 RowSorterListener 提供更改的通知。它发送两种类型的通知:

  • RowSorterEvent.Type.SORT_ORDER_CHANGED — 通知侦听器排序顺序发生了更改。此通知通常后跟一个通知,表示排序发生了更改。
  • RowSorterEvent.Type.SORTED — 通知侦听器由 RowSorter 维护的映射关系已经以某种方式发生了更改。
RowSorter 实现与底层模型通常没有一对一的映射关系,但它们也可以这样做。例如,如果数据库进行排序操作,则可以通过数据库调用 toggleSortOrder (在后台线程上),并重写映射方法以返回传入的参数。

RowSorter 的具体实现需要引用一个模型,比如 TableModelListModelJTableJList 之类的视图类也将引用该模型。要避免排序依赖关系,RowSorter 实现不应该在模型上安装侦听器。而是在模型更改时,视图类调用 RowSorter。例如,如果在 TableModel 中更新了一行,则 JTable 调用 rowsUpdated。模型更改时,视图可以调用任意以下方法:modelStructureChangedallRowsChangedrowsInsertedrowsDeletedrowsUpdated

从以下版本开始:
1.6
另请参见:
TableRowSorter

嵌套类摘要
static class RowSorter.SortKey
          SortKey 描述特定列的排序顺序。
 
构造方法摘要
RowSorter()
          创建一个RowSorter
 
方法摘要
 void addRowSorterListener(RowSorterListener l)
          添加一个 RowSorterListener 来接收有关此 RowSorter 的通知。
abstract  void allRowsChanged()
          当底层模型的内容完全更改时,调用此方法。
abstract  int convertRowIndexToModel(int index)
          返回基于底层模型的 index 的位置。
abstract  int convertRowIndexToView(int index)
          返回基于视图 index 的位置。
protected  void fireRowSorterChanged(int[] lastRowIndexToModel)
          通知侦听器映射关系发生了更改。
protected  void fireSortOrderChanged()
          通知侦听器排序顺序发生了更改。
abstract  M getModel()
          返回底层模型。
abstract  int getModelRowCount()
          返回底层模型中的行数。
abstract  List<? extends RowSorter.SortKey> getSortKeys()
          返回当前排序键。
abstract  int getViewRowCount()
          返回视图中的行数。
abstract  void modelStructureChanged()
          当底层模型结构完全更改时,调用此方法。
 void removeRowSorterListener(RowSorterListener l)
          移除一个 RowSorterListener
abstract  void rowsDeleted(int firstRow, int endRow)
          当行已经从指定范围(包括)内的底层模型中被删除时,调用此方法。
abstract  void rowsInserted(int firstRow, int endRow)
          当行已经插入到指定范围(包括)内的底层模型时,调用此方法。
abstract  void rowsUpdated(int firstRow, int endRow)
          当行已经在指定范围(包括)内的底层模型中被更改时,调用此方法。
abstract  void rowsUpdated(int firstRow, int endRow, int column)
          当行中的列已经在指定范围内的底层模型中被更新时,调用此方法。
abstract  void setSortKeys(List<? extends RowSorter.SortKey> keys)
          设置当前排序键。
abstract  void toggleSortOrder(int column)
          颠倒指定列的排序顺序。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

RowSorter

public RowSorter()
创建一个 RowSorter

方法详细信息

getModel

public abstract M getModel()
返回底层模型。

返回:
底层模型

toggleSortOrder

public abstract void toggleSortOrder(int column)
颠倒指定列的排序顺序。调用此方法时,由子类提供具体行为。通常,如果指定列已经是主要排序列,则此方法将升序变为降序(或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。

如果此方法导致更改排序顺序和排序操作,则它将发送适当的 RowSorterListener 通知。

参数:
column - 要切换排序顺序的列,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果列超出底层模型的范围

convertRowIndexToModel

public abstract int convertRowIndexToModel(int index)
返回基于底层模型的 index 的位置。也就是说,对于视图坐标中的行 index,此方法返回基于底层模型的行索引。

参数:
index - 基于底层视图的行索引
返回:
基于视图的行索引
抛出:
IndexOutOfBoundsException - 如果 index 超出视图的范围

convertRowIndexToView

public abstract int convertRowIndexToView(int index)
返回基于视图 index 的位置。也就是说,对于底层模型坐标中的行 index,此方法返回基于视图的行索引。

参数:
index - 基于底层模型的行索引
返回:
返回基于视图的行索引;如果索引已经被过滤出视图,则返回 -1
抛出:
IndexOutOfBoundsException - 如果 index 超出模型的范围

setSortKeys

public abstract void setSortKeys(List<? extends RowSorter.SortKey> keys)
设置当前排序键。

参数:
keys - 新的 SortKeysnull 是指定一个空列表的简写,表示视图应该是未排序的。

getSortKeys

public abstract List<? extends RowSorter.SortKey> getSortKeys()
返回当前排序键。此方法必须返回一个 非 null List,可以返回一个无法修改的 List。如果需要更改排序键,可创建所返回 List 的一个副本,更改该副本并使用新列表调用 setSortKeys

返回:
当前排序顺序

getViewRowCount

public abstract int getViewRowCount()
返回视图中的行数。如果该内容已被过滤,则此值可能不同于底层模型的行数。

返回:
视图中的行数
另请参见:
getModelRowCount()

getModelRowCount

public abstract int getModelRowCount()
返回底层模型中的行数。

返回:
底层模型中的行数
另请参见:
getViewRowCount()

modelStructureChanged

public abstract void modelStructureChanged()
当底层模型结构完全更改时,调用此方法。例如,如果 TableModel 中的列数发生了更改,则此方法将被调用。

通常不调用此方法。此方法是公共的,允许视图类调用它。


allRowsChanged

public abstract void allRowsChanged()
当底层模型的内容完全更改时,调用此方法。表的结构相同,只有内容发生了更改。当对于其他方法来说标记此更改的代价太过昂贵时,通常使用此方法。

通常不调用此方法。此方法是公共的,允许视图类调用它。


rowsInserted

public abstract void rowsInserted(int firstRow,
                                  int endRow)
当行已经插入到指定范围(包括)内的底层模型时,调用此方法。

参数指定有效范围的索引。第一个参数是基于更改之前的模型的,必须小于等于更改之前的模型的大小。第二个参数是基于更改之后的模型的,必须小于更改之后的模型的大小。例如,如果有一个 5 行的模型并在该模型的尾部添加 3 个项,则其索引为 5、7。

通常不调用此方法。此方法是公共的,允许视图类调用它。

参数:
firstRow - 第一行
endRow - 最后一行
抛出:
IndexOutOfBoundsException - 如果任一参数无效,或者 firstRow > endRow

rowsDeleted

public abstract void rowsDeleted(int firstRow,
                                 int endRow)
当行已经从指定范围(包括)内的底层模型中被删除时,调用此方法。

参数指定有效范围的索引,其基于更改之前的模型。例如,如果有一个 5 行的模型并从模型的尾部删除 3 个项,则其索引为 2、4。

通常不调用此方法。此方法是公共的,允许视图类调用它。

参数:
firstRow - 第一行
endRow - 最后一行
抛出:
IndexOutOfBoundsException - 如果任一参数超出模型更改之前的范围,或者 firstRow > endRow

rowsUpdated

public abstract void rowsUpdated(int firstRow,
                                 int endRow)
当行已经在指定范围(包括)内的底层模型中被更改时,调用此方法。

通常不调用此方法。此方法是公共的,允许视图类调用它。

参数:
firstRow - 第一行,就底层模型而言
endRow - 最后一行,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果任一参数超出模型更改之前的范围,或者 firstRow > endRow

rowsUpdated

public abstract void rowsUpdated(int firstRow,
                                 int endRow,
                                 int column)
当行中的列已经在指定范围内的底层模型中被更新时,调用此方法。

通常不调用此方法。此方法是公共的,允许视图类调用它。

参数:
firstRow - 第一行,就底层模型而言
endRow - 最后一行,就底层模型而言
column - 已更改的列,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果任一参数超出底层模型更改之后的范围, firstRow > endRow 或者 column 超出底层模型的范围

addRowSorterListener

public void addRowSorterListener(RowSorterListener l)
添加一个 RowSorterListener 来接收有关此 RowSorter 的通知。如果多次添加相同的侦听器,则它将接收多个通知。如果 lnull,则不执行任何操作。

参数:
l - RowSorterListener

removeRowSorterListener

public void removeRowSorterListener(RowSorterListener l)
移除一个 RowSorterListener。如果 lnull,则不执行任何操作。

参数:
l - RowSorterListener

fireSortOrderChanged

protected void fireSortOrderChanged()
通知侦听器排序顺序发生了更改。


fireRowSorterChanged

protected void fireRowSorterChanged(int[] lastRowIndexToModel)
通知侦听器映射关系发生了更改。

参数:
lastRowIndexToModel - 模型索引到排序之前视图索引的映射关系,可以为 null