- 类型参数:
M- 模型的类型I- 传递给RowFilter的标识符的类型
- 已知子类:
TableRowSorter
RowSorter 的实现,提供围绕基于网格的数据模型的排序和过滤。除了创建和安装 RowSorter 之外,您很少需要直接与一个进行交互。 JTable的RowSorter的具体实现请参考TableRowSorter 。
排序是根据当前的SortKeys,按顺序进行的。如果两个对象相等(列的 Comparator 返回 0),则使用下一个 SortKey。如果没有 SortKey 剩余或顺序为 UNSORTED ,则使用模型中行的顺序。
每列的排序是通过可以使用 setComparator 方法指定的 Comparator 完成的。如果未指定 Comparator,则 Collator.getInstance() 返回的 Comparator 用于对基础对象调用 toString 的结果。 Comparator 永远不会通过 null 。 null 值被视为出现在非 null 值之前,并且两个 null 值被视为相等。
如果指定一个 Comparator 将其参数转换为模型提供的类型以外的类型,则在对数据排序时将抛出 ClassCastException。
除了排序之外,DefaultRowSorter 还提供了过滤行的能力。过滤是通过使用 setRowFilter 方法指定的 RowFilter 完成的。如果未指定过滤器,则包括所有行。
默认情况下,行是未排序的(与模型相同),每一列都是可排序的。默认 Comparator 记录在子类中(例如, TableRowSorter )。
如果基础模型结构发生变化(调用 modelStructureChanged 方法),以下内容将重置为其默认值:Comparator s by column、当前排序顺序以及每列是否可排序。要查找默认的 Comparator ,请参阅具体实现(例如, TableRowSorter )。默认排序顺序是未排序的(和模型一样),列默认是可排序的。
DefaultRowSorter 是一个抽象类。具体的子类必须通过调用 setModelWrapper 来提供对底层数据的访问。 setModelWrapper 方法必须在调用构造函数后立即调用,最好是从子类的构造函数中调用。如果您在未指定 ModelWrapper 的情况下使用 DefaultRowSorter,将导致未定义的行为。
DefaultRowSorter 有两个正式的类型参数。第一个类型参数对应于模型的类,例如 DefaultTableModel 。第二个类型参数对应于传递给 RowFilter 的标识符的类。有关类型参数的更多详细信息,请参阅 TableRowSorter 和 RowFilter。
- 自从:
- 1.6
- 参见:
-
内部类总结
内部类修饰符和类型类描述protected static classDefaultRowSorter.ModelWrapper负责提供由DefaultRowSorter排序的数据。在类 javax.swing.RowSorter 中声明的嵌套类/接口
RowSorter.SortKey -
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述void当底层模型的内容完全改变时调用。intconvertRowIndexToModel(int index) 根据基础模型返回index的位置。intconvertRowIndexToView(int index) 根据视图返回index的位置。Comparator<?>getComparator(int column) 返回指定列的Comparator。int返回排序键的最大数量。final MgetModel()返回基础模型。int返回基础模型中的行数。protected final DefaultRowSorter.ModelWrapper<M,I> 返回提供正在排序和过滤的数据的模型包装器。返回确定哪些行(如果有)应从视图中隐藏的过滤器。List<? extends RowSorter.SortKey>返回当前排序键。boolean如果在更新基础模型时应该进行排序,则返回 true;否则,返回假。int返回视图中的行数。booleanisSortable(int column) 如果指定的列是可排序的,则返回真;否则,假的。void当底层模型结构完全改变时调用。voidrowsDeleted(int firstRow, int endRow) 当已从指定范围(含)的基础模型中删除行时调用。voidrowsInserted(int firstRow, int endRow) 在指定范围(含)内的基础模型中插入行时调用。voidrowsUpdated(int firstRow, int endRow) 当底层模型中的行在指定范围(含)之间发生更改时调用。voidrowsUpdated(int firstRow, int endRow, int column) 当行中的列已在指定范围之间的基础模型中更新时调用。voidsetComparator(int column, Comparator<?> comparator) 将Comparator设置为在对指定列进行排序时使用。voidsetMaxSortKeys(int max) 设置排序键的最大数量。protected final voidsetModelWrapper(DefaultRowSorter.ModelWrapper<M, I> modelWrapper) 设置提供正在排序和过滤的数据的模型包装器。voidsetRowFilter(RowFilter<? super M, ? super I> filter) 设置过滤器以确定哪些行(如果有)应从视图中隐藏。voidsetSortable(int column, boolean sortable) 设置指定列是否可排序。voidsetSortKeys(List<? extends RowSorter.SortKey> sortKeys) 设置排序键。voidsetSortsOnUpdates(boolean sortsOnUpdates) 如果为真,则指定在更新基础模型(调用rowsUpdated)时应该进行排序。voidsort()根据当前正在排序的列的排序键和与此排序器关联的过滤器(如果有)对视图中的行进行排序和过滤。voidtoggleSortOrder(int column) 如果指定的列已经是主要排序列,则将排序顺序从升序反转为降序(或降序为升序);否则,使指定的列成为主要排序列,并按升序排序。protected booleanuseToString(int column) 返回排序时是否在进行比较之前将值转换为字符串。在类 javax.swing.RowSorter 中声明的方法
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
-
构造方法详细信息
-
DefaultRowSorter
public DefaultRowSorter()创建一个空的DefaultRowSorter。
-
-
方法详情
-
setModelWrapper
设置提供正在排序和过滤的数据的模型包装器。- 参数:
modelWrapper- 负责提供排序和过滤数据的模型包装器- 抛出:
IllegalArgumentException- 如果modelWrapper是null
-
getModelWrapper
返回提供正在排序和过滤的数据的模型包装器。- 返回:
- 负责提供排序和过滤数据的模型包装器
-
getModel
返回基础模型。 -
setSortable
public void setSortable(int column, boolean sortable) 设置指定列是否可排序。仅在调用toggleSortOrder时检查指定值。通过直接设置排序键,仍然可以对已标记为不可排序的列进行排序。默认为真。- 参数:
column- 根据基础模型启用或禁用排序的列sortable- 指定列是否可排序- 抛出:
IndexOutOfBoundsException- 如果column超出模型范围- 参见:
-
isSortable
public boolean isSortable(int column) 如果指定的列是可排序的,则返回真;否则,假的。- 参数:
column- 根据基础模型检查排序的列- 返回:
- 如果该列是可排序的,则为真
- 抛出:
IndexOutOfBoundsException- 如果列超出基础模型的范围
-
setSortKeys
设置排序键。这将创建所提供的List的副本;对提供的List的后续更改不会影响此DefaultRowSorter。如果排序键已更改,则会触发排序。- 指定者:
setSortKeys在类RowSorter<M>中- 参数:
sortKeys- 新的SortKeys;null是指定空列表的简写,表示视图应该是未排序的- 抛出:
IllegalArgumentException- 如果sortKeys中的任何值为空或列索引超出模型范围
-
getSortKeys
返回当前排序键。这将返回一个不可修改的non-null List。如果您需要更改排序键,请复制返回的List,改变副本并使用新列表调用setSortKeys。- 指定者:
getSortKeys在类RowSorter<M>中- 返回:
- 当前排序顺序
-
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) 如果为真,则指定在更新基础模型(调用rowsUpdated)时应该进行排序。例如,如果这是真的,并且用户编辑了一个条目,那么该条目在视图中的位置可能会改变。默认为假。- 参数:
sortsOnUpdates- 是否对更新事件进行排序
-
getSortsOnUpdates
public boolean getSortsOnUpdates()如果在更新基础模型时应该进行排序,则返回 true;否则,返回假。- 返回:
- 模型更新时是否排序
-
setRowFilter
设置过滤器以确定哪些行(如果有)应从视图中隐藏。过滤器在排序之前应用。null值表示应包括模型中的所有值。RowFilter的include方法传递了一个包装底层模型的Entry。Entry中的列数对应于ModelWrapper中的列数。标识符也来自ModelWrapper。此方法触发排序。
- 参数:
filter- 用于确定应包含哪些条目的过滤器
-
getRowFilter
返回确定哪些行(如果有)应从视图中隐藏的过滤器。- 返回:
- 过滤器
-
toggleSortOrder
public void toggleSortOrder(int column) 如果指定的列已经是主要排序列,则将排序顺序从升序反转为降序(或降序为升序);否则,使指定的列成为主要排序列,并按升序排序。如果指定的列不可排序,则此方法无效。- 指定者:
toggleSortOrder在类RowSorter<M>中- 参数:
column- 就基础模型而言,构成主要排序列的列的索引- 抛出:
IndexOutOfBoundsException- 如果列超出基础模型的范围- 参见:
-
convertRowIndexToView
public int convertRowIndexToView(int index) 根据视图返回index的位置。也就是说,对于基础模型坐标中的行index,这将返回根据视图的行索引。- 指定者:
convertRowIndexToView在类RowSorter<M>中- 参数:
index- 就底层模型而言的行索引- 返回:
- 根据视图的行索引,如果索引已从视图中过滤掉,则为 -1
- 抛出:
IndexOutOfBoundsException- 如果index超出模型范围
-
convertRowIndexToModel
public int convertRowIndexToModel(int index) 根据基础模型返回index的位置。也就是说,对于视图坐标中的行index,这会根据基础模型返回行索引。- 指定者:
convertRowIndexToModel在类RowSorter<M>中- 参数:
index- 就底层视图而言的行索引- 返回:
- 根据视图的行索引
- 抛出:
IndexOutOfBoundsException- 如果index在视图范围之外
-
sort
public void sort()根据当前正在排序的列的排序键和与此排序器关联的过滤器(如果有)对视图中的行进行排序和过滤。空的sortKeys列表表示视图应该未排序,与模型相同。- 参见:
-
useToString
protected boolean useToString(int column) 返回排序时是否在进行比较之前将值转换为字符串。如果为真,将使用ModelWrapper.getStringValueAt,否则将使用ModelWrapper.getValueAt。由子类(例如TableRowSorter)在其ModelWrapper实现中遵守此值。- 参数:
column- 就底层模型而言,要测试的列的索引- 返回:
- 如果在排序时进行比较之前要将值转换为字符串,则为 true
- 抛出:
IndexOutOfBoundsException- 如果column无效
-
setComparator
将Comparator设置为在对指定列进行排序时使用。这不会触发排序。如果要在设置比较器后进行排序,则需要显式调用sort。- 参数:
column- 就底层模型而言,Comparator将用于的列的索引comparator- 要使用的Comparator- 抛出:
IndexOutOfBoundsException- 如果column超出基础模型的范围
-
getComparator
返回指定列的Comparator。如果没有为该列指定Comparator,这将返回null。- 参数:
column- 根据底层模型获取Comparator的列- 返回:
-
指定列的
Comparator - 抛出:
IndexOutOfBoundsException- 如果列超出基础模型的范围
-
getViewRowCount
public int getViewRowCount()返回视图中的行数。如果内容已被过滤,这可能与基础模型的行数不同。- 指定者:
getViewRowCount在类RowSorter<M>中- 返回:
- 视图中的行数
- 参见:
-
getModelRowCount
public int getModelRowCount()返回基础模型中的行数。- 指定者:
getModelRowCount在类RowSorter<M>中- 返回:
- 基础模型中的行数
- 参见:
-
modelStructureChanged
public void modelStructureChanged()当底层模型结构完全改变时调用。例如,如果TableModel中的列数发生变化,将调用此方法。您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
modelStructureChanged在类RowSorter<M>中
-
allRowsChanged
public void allRowsChanged()当底层模型的内容完全改变时调用。表的结构是一样的,只是内容变了。这通常是在用其他方法来描述变化的成本太高时发送的。您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
allRowsChanged在类RowSorter<M>中
-
rowsInserted
public void rowsInserted(int firstRow, int endRow) 在指定范围(含)内的基础模型中插入行时调用。参数给出受影响范围的索引。第一个参数是根据更改前的模型计算的,并且必须小于或等于更改前模型的大小。第二个参数是根据更改后的模型计算的,必须小于更改后模型的大小。例如,如果您有一个 5 行模型并将 3 个项目添加到模型的末尾,则索引为 5、7。
您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
rowsInserted在类RowSorter<M>中- 参数:
firstRow- 第一行endRow- 最后一行- 抛出:
IndexOutOfBoundsException- 如果任一参数无效,或者firstRow>endRow
-
rowsDeleted
public void rowsDeleted(int firstRow, int endRow) 当已从指定范围(含)的基础模型中删除行时调用。参数给出了受影响范围的索引,并根据模型before改变。例如,如果您有一个 5 行模型并从模型末尾删除 3 个项目,则索引为 2、4。
您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
rowsDeleted在类RowSorter<M>中- 参数:
firstRow- 第一行endRow- 最后一行- 抛出:
IndexOutOfBoundsException- 如果任一参数在更改前超出模型范围,或者firstRow>endRow
-
rowsUpdated
public void rowsUpdated(int firstRow, int endRow) 当底层模型中的行在指定范围(含)之间发生更改时调用。您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
rowsUpdated在类RowSorter<M>中- 参数:
firstRow- 第一行,就底层模型而言endRow- 最后一行,就底层模型而言- 抛出:
IndexOutOfBoundsException- 如果任一参数超出基础模型的范围,或者firstRow>endRow
-
rowsUpdated
public void rowsUpdated(int firstRow, int endRow, int column) 当行中的列已在指定范围之间的基础模型中更新时调用。您通常不会调用此方法。此方法是公共的,以允许视图类调用它。
- 指定者:
rowsUpdated在类RowSorter<M>中- 参数:
firstRow- 第一行,就底层模型而言endRow- 最后一行,就底层模型而言column- 已更改的列,就基础模型而言- 抛出:
IndexOutOfBoundsException- 如果任一参数在更改后超出基础模型的范围,则firstRow>endRow或column超出基础模型的范围
-