JavaTM Platform
Standard Ed. 6

javax.swing
类 DefaultRowSorter<M,I>

java.lang.Object
  继承者 javax.swing.RowSorter<M>
      继承者 javax.swing.DefaultRowSorter<M,I>
类型参数:
M - 模型的类型
I - 传递给 RowFilter 的标识符类型
直接已知子类:
TableRowSorter

public abstract class DefaultRowSorter<M,I>
     
extends RowSorter<M>

RowSorter 的一个实现,它围绕基于网格的数据模型提供排序和过滤操作。除了创建和安装 RowSorter 之外,几乎不需要直接与它交互。有关 JTableRowSorter 具体实现,请参阅 TableRowSorter

排序操作依次根据当前的 SortKey 完成。如果两个对象相等(Comparator 对于列返回 0),则使用下一个 SortKey。如果没有剩余的 SortKey 或者顺序为 UNSORTED,则使用模型中行的顺序。

每一列的排序操作通过 Comparator 来完成,可以使用 setComparator 方法来指定 Comparator。如果尚未指定 Comparator,则先对底层对象调用 toString,再对其结果调用 Collator.getInstance(),使用所返回的 ComparatorComparator 不传递 nullnull 值被视为在非 null 值之前出现,两个 null 值被认为是相等的。

如果指定的 Comparator 将其参数强制转换为一个模型没有提供的类型,则对数据进行排序时将抛出 ClassCastException

除了排序操作,DefaultRowSorter 还提供过滤行的能力。过滤操作通过用 setRowFilter 方法指定的 RowFilter 来完成。如果没有指定过滤器,则包含所有行。

默认情况下,行是未排序的(与模型相同),每一列都是可排序的。默认的 Comparator 记录在子类中(例如,TableRowSorter)。

如果底层模型结构更改(调用了 modelStructureChanged 方法),则以下内容被重置为默认值:按列的 Comparator、当前排序顺序、每一列是否都是可排序的。要找到默认的 Comparator,请参阅具体实现(例如,TableRowSorter)。默认的排序顺序是未排序的(与模型相同),默认情况下列是可排序的。

如果底层模型结构更改(调用了 modelStructureChanged 方法),则以下内容被重置为默认值:按列的 Comparator、当前排序顺序、某一列是否是可排序的。

DefaultRowSorter 是一个抽象类。通过调用 setModelWrapper,具体子类必须提供对底层数据的访问。调用构造方法之后必须立即调用 setModelWrapper 方法,最好是从子类的构造方法中进行调用。如果使用 DefaultRowSorter 时没有指定 ModelWrapper,则会导致不确定的行为。

DefaultRowSorter 有两种形式的类型参数。第一种类型参数对应于模型的类,例如 DefaultTableModel。第二种类型参数对应于传递给 RowFilter 的标识符的类。有关类型参数的详细信息,请参阅 TableRowSorterRowFilter

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

嵌套类摘要
protected static class DefaultRowSorter.ModelWrapper<M,I>
          DefaultRowSorter.ModelWrapper 负责提供由 DefaultRowSorter 进行排序的数据。
 
从类 javax.swing.RowSorter 继承的嵌套类/接口
RowSorter.SortKey
 
构造方法摘要
DefaultRowSorter()
          创建一个空 DefaultRowSorter
 
方法摘要
 void allRowsChanged()
          当底层模型的内容完全更改时,调用此方法。
 int convertRowIndexToModel(int index)
          返回基于底层模型的 index 的位置。
 int convertRowIndexToView(int index)
          返回基于视图 index 的位置。
 Comparator<?> getComparator(int column)
          返回指定列的 Comparator
 int getMaxSortKeys()
          返回排序键的最大数量。
 M getModel()
          返回底层模型。
 int getModelRowCount()
          返回底层模型中的行数。
protected  DefaultRowSorter.ModelWrapper<M,I> getModelWrapper()
          返回模型包装器,它提供将要进行排序和过滤的数据。
 RowFilter<? super M,? super I> getRowFilter()
          返回用于确定哪些行(如果有)应该在视图中隐藏的过滤器。
 List<? extends RowSorter.SortKey> getSortKeys()
          返回当前排序键。
 boolean getSortsOnUpdates()
          如果底层模型更新时应该进行排序,则返回 true;否则返回 false。
 int getViewRowCount()
          返回视图中的行数。
 boolean isSortable(int column)
          如果指定的列可排序,则返回 true;否则返回 false。
 void modelStructureChanged()
          当底层模型结构完全更改时,调用此方法。
 void rowsDeleted(int firstRow, int endRow)
          当行已经从指定范围(包括)内的底层模型中被删除时,调用此方法。
 void rowsInserted(int firstRow, int endRow)
          当行已经插入到指定范围(包括)内的底层模型时,调用此方法。
 void rowsUpdated(int firstRow, int endRow)
          当行已经在指定范围(包括)内的底层模型中被更改时,调用此方法。
 void rowsUpdated(int firstRow, int endRow, int column)
          当行中的列已经在指定范围内的底层模型中被更新时,调用此方法。
 void setComparator(int column, Comparator<?> comparator)
          设置对指定列进行排序时要使用的 Comparator
 void setMaxSortKeys(int max)
          设置排序键的最大数量。
protected  void setModelWrapper(DefaultRowSorter.ModelWrapper<M,I> modelWrapper)
          设置模型包装器,它提供将要进行排序和过滤的数据。
 void setRowFilter(RowFilter<? super M,? super I> filter)
          设置用于确定哪些行(如果有)应该在视图中隐藏的过滤器。
 void setSortable(int column, boolean sortable)
          设置指定列是否可排序。
 void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
          设置排序键。
 void setSortsOnUpdates(boolean sortsOnUpdates)
          如果为 true,则指定应该在底层模型更新(调用了 rowsUpdated)时进行排序。
 void sort()
          根据当前正在排序的列的排序键以及与此排序器关联的过滤器(如果有)对视图中的行进行排序和过滤。
 void toggleSortOrder(int column)
          如果指定列已经是主要排序列,则反转排序顺序(将升序变为降序,或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。
protected  boolean useToString(int column)
          返回排序过程中进行比较之前是否要将值转换为字符串。
 
从类 javax.swing.RowSorter 继承的方法
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

DefaultRowSorter

public DefaultRowSorter()
创建一个空 DefaultRowSorter

方法详细信息

setModelWrapper

protected final void setModelWrapper(DefaultRowSorter.ModelWrapper<M,I> modelWrapper)
设置模型包装器,它提供将要进行排序和过滤的数据。

参数:
modelWrapper - 负责提供要进行排序和过滤的数据的模型包装器
抛出:
IllegalArgumentException - 如果 modelWrappernull

getModelWrapper

protected final DefaultRowSorter.ModelWrapper<M,I> getModelWrapper()
返回模型包装器,它提供将要进行排序和过滤的数据。

返回:
负责提供要进行排序和过滤的数据的模型包装器

getModel

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

指定者:
RowSorter<M> 中的 getModel
返回:
底层模型

setSortable

public void setSortable(int column,
                        boolean sortable)
设置指定列是否可排序。只有调用 toggleSortOrder 时才检查指定的值。通过直接设置排序键,仍然可以对已标记为不可排序的列进行排序。默认值为 true。

参数:
column - 要启用排序或禁用排序的列,就底层模型而言
sortable - 指定的列是否可排序
抛出:
IndexOutOfBoundsException - 如果 column 超出模型的范围
另请参见:
toggleSortOrder(int), setSortKeys(java.util.List )

isSortable

public boolean isSortable(int column)
如果指定的列可排序,则返回 true;否则返回 false。

参数:
column - 要检查排序的列,就底层模型而言
返回:
如果该列可排序,则返回 true
抛出:
IndexOutOfBoundsException - 如果 column 超出底层模型的范围

setSortKeys

public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
设置排序键。此方法创建所提供 List 的一个副本;对所提供 List 的后续更改不影响此 DefaultRowSorter。如果排序键已更改,则此方法触发一个排序。

指定者:
RowSorter<M> 中的 setSortKeys
参数:
sortKeys - 新的 SortKeynull 是指定一个空列表的简单表示方法,表示视图应该是未排序的。
抛出:
IllegalArgumentException - 如果 sortKey 中的任一值为 null,或者有超出模型范围的列索引

getSortKeys

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

指定者:
RowSorter<M> 中的 getSortKeys
返回:
当前排序顺序

setMaxSortKeys

public void setMaxSortKeys(int max)
设置排序键的最大数量。排序键的数量决定了排序时如何解决相等的值。例如,假定创建了一个表格行排序器并对其调用 setMaxSortKeys(2)。用户单击列 1 表头,使表格行按照列 1 中的项进行排序。然后,用户单击列 2 的表头,使表格按照列 2 中的项进行排序;如果列 2 中的所有项都相等,则按照列 1 中的项对那些特定行进行排序。在这种情况下,我们说行首先在列 2 上进行排序,其次在列 1 上进行排序。如果用户单击列 3 的表头,则首先在列 3 上对项进行排序,其次在列 2 上进行排序。由于排序键的最大数量已经通过 setMaxSortKeys 被设置为 2,所以列 1 不再影响顺序。

排序键的最大数量由 toggleSortOrder 强制指定。可以通过直接调用 setSortKeys 指定更多的排序键,并且这些排序键都将被遵守。但是,如果之后调用了 toggleSortOrder,则将强制指定排序键的最大数量。默认值为 3。

参数:
max - 排序键的最大数量
抛出:
IllegalArgumentException - 如果 max < 1

getMaxSortKeys

public int getMaxSortKeys()
返回排序键的最大数量。

返回:
排序键的最大数量

setSortsOnUpdates

public void setSortsOnUpdates(boolean sortsOnUpdates)
如果为 true,则指定应该在底层模型更新(调用了 rowsUpdated)时进行排序。例如,如果为 true 并且用户编辑了一个条目,则该项在视图中的位置可能改变。默认值为 false。

参数:
sortsOnUpdates - 是否在发生更新事件时进行排序

getSortsOnUpdates

public boolean getSortsOnUpdates()
如果底层模型更新时应该进行排序,则返回 true;否则返回 false。

返回:
模型更新时是否进行排序

setRowFilter

public void setRowFilter(RowFilter<? super M,? super I> filter)
设置用于确定哪些行(如果有)应该在视图中隐藏的过滤器。过滤器在排序之前应用。 null 值表示应该包括模型中的所有值。

将包装底层模型的 Entry 传递给 RowFilterinclude 方法。Entry 的列数对应于 ModelWrapper 的列数。标识符也取自该 ModelWrapper

此方法将触发排序。

参数:
filter - 用于确定应该包括哪些条目的过滤器

getRowFilter

public RowFilter<? super M,? super I> getRowFilter()
返回用于确定哪些行(如果有)应该在视图中隐藏的过滤器。

返回:
过滤器

toggleSortOrder

public void toggleSortOrder(int column)
如果指定列已经是主要排序列,则反转排序顺序(将升序变为降序,或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。

指定者:
RowSorter<M> 中的 toggleSortOrder
参数:
column - 要变为主要排序列的列索引,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果列超出底层模型的范围
另请参见:
setSortable(int,boolean), setMaxSortKeys(int)

convertRowIndexToView

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

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

convertRowIndexToModel

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

指定者:
RowSorter<M> 中的 convertRowIndexToModel
参数:
index - 基于底层视图的行索引
返回:
基于视图的行索引
抛出:
IndexOutOfBoundsException - 如果 index 超出视图的范围

sort

public void sort()
根据当前正在排序的列的排序键以及与此排序器关联的过滤器(如果有)对视图中的行进行排序和过滤。空 sortKeys 列表表示视图应该未排序,与模型相同。

另请参见:
setRowFilter(javax.swing.RowFilter ), setSortKeys(java.util.List )

useToString

protected boolean useToString(int column)
返回排序过程中进行比较之前是否要将值转换为字符串。如果为 true,则将使用 ModelWrapper.getStringValueAt;否则,将使用 ModelWrapper.getValueAt。由子类(比如 TableRowSorter)决定是否在其 ModelWrapper 实现中遵守此值。

参数:
column - 要测试的列的索引,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果 column 无效

setComparator

public void setComparator(int column,
                          Comparator<?> comparator)
设置对指定列进行排序时要使用的 Comparator。此方法不会触发排序。如果想要在设置比较器之后进行排序,则需要显式地调用 sort

参数:
column - 要应用 Comparator 的列的索引,就底层模型而言
comparator - 要使用的 Comparator
抛出:
IndexOutOfBoundsException - 如果 column 超出底层模型的范围

getComparator

public Comparator<?> getComparator(int column)
返回指定列的 Comparator。如果没有为列指定 Comparator,则此方法将返回 null

参数:
column - 要获取 Comparator 的列,就底层模型而言
返回:
指定列的 Comparator
抛出:
IndexOutOfBoundsException - 如果 column 超出底层模型的范围

getViewRowCount

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

指定者:
RowSorter<M> 中的 getViewRowCount
返回:
视图中的行数
另请参见:
RowSorter.getModelRowCount()

getModelRowCount

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

指定者:
RowSorter<M> 中的 getModelRowCount
返回:
底层模型中的行数
另请参见:
RowSorter.getViewRowCount()

modelStructureChanged

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

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

指定者:
RowSorter<M> 中的 modelStructureChanged

allRowsChanged

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

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

指定者:
RowSorter<M> 中的 allRowsChanged

rowsInserted

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

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

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

指定者:
RowSorter<M> 中的 rowsInserted
参数:
firstRow - 第一行
endRow - 最后一行
抛出:
IndexOutOfBoundsException - 如果任一参数无效,或者 firstRow > endRow

rowsDeleted

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

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

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

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

rowsUpdated

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

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

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

rowsUpdated

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

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

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

JavaTM Platform
Standard Ed. 6

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策