- 类型参数:
-
M- 模型的类型 -
I- 传递给RowFilter的标识符的类型
- 直接已知子类:
-
TableRowSorter
RowSorter的实现,提供围绕基于网格的数据模型的排序和过滤。除了创建和安装RowSorter之外,您很少需要直接与其交互。有关JTable的RowSorter的具体实现,请参阅TableRowSorter。
排序是基于当前SortKey按顺序进行的。如果两个对象相等(列的Comparator返回0),则使用下一个SortKey。如果没有剩余的SortKey或顺序为UNSORTED,则使用模型中的行的顺序。
每列的排序是通过您可以使用setComparator方法指定的Comparator完成的。如果未指定Comparator,则在调用基础对象的toString的结果上使用Collator.getInstance()返回的Comparator。Comparator永远不会传递null。null值被视为出现在非null值之前,并且两个null值被视为相等。
如果指定了将其参数转换为模型提供的类型之外的类型的Comparator,则在对数据进行排序时将抛出ClassCastException。
除了排序,DefaultRowSorter还提供了过滤行的功能。过滤是通过使用setRowFilter方法指定的RowFilter完成的。如果未指定过滤器,则包括所有行。
默认情况下,行按未排序顺序排列(与模型相同),每列都是可排序的。默认的Comparator在子类中有文档记录(例如,TableRowSorter)。
如果底层模型结构发生更改(调用了modelStructureChanged方法),则以下内容将重置为其默认值:按列排序的Comparator、当前排序顺序以及每列是否可排序。要查找默认的Comparator,请参阅具体实现(例如,TableRowSorter)。默认排序顺序为未排序(与模型相同),默认情况下每列都是可排序的。
DefaultRowSorter是一个抽象类。具体的子类必须通过调用setModelWrapper来提供对基础数据的访问。最好在构造函数中调用setModelWrapper方法,否则将导致未定义的行为。
DefaultRowSorter有两个形式类型参数。第一个类型参数对应于模型的类,例如DefaultTableModel。第二个类型参数对应于传递给RowFilter的标识符的类。有关类型参数的更多详细信息,请参阅TableRowSorter和RowFilter。
- 自版本:
- 1.6
- 参见:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classDefaultRowSorter.ModelWrapper负责提供DefaultRowSorter排序的数据。Nested classes/interfaces declared in class javax.swing.RowSorter
RowSorter.SortKey -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid当底层模型的内容完全更改时调用。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;否则返回false。int返回视图中的行数。booleanisSortable(int column) 如果指定的列可排序,则返回true;否则返回false。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) 如果为true,则指定在更新底层模型时应进行排序(调用rowsUpdated)。voidsort()根据当前正在排序的列的排序键和与此排序器关联的过滤器(如果有)对视图中的行进行排序和过滤。voidtoggleSortOrder(int column) 如果指定的列已经是主要排序列,则将排序顺序从升序更改为降序(或从降序更改为升序);否则,将指定的列设置为主要排序列,并使用升序排序顺序。protected booleanuseToString(int column) 返回在进行排序时是否将值转换为字符串进行比较的结果。Methods declared in class javax.swing.RowSorter
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
-
Constructor Details
-
DefaultRowSorter
public DefaultRowSorter()创建一个空的DefaultRowSorter。
-
-
Method Details
-
setModelWrapper
设置提供正在排序和过滤的数据的模型包装器。- 参数:
-
modelWrapper- 负责提供将被DefaultRowSorter排序和过滤的数据的模型包装器 - 抛出:
-
IllegalArgumentException- 如果modelWrapper为null
-
getModelWrapper
返回提供正在排序和过滤的数据的模型包装器。- 返回:
- 负责提供将被排序和过滤的数据的模型包装器
-
getModel
返回底层模型。 -
setSortable
public void setSortable(int column, boolean sortable) 设置指定列是否可排序。仅在调用toggleSortOrder时才检查指定的值。仍然可以对已标记为不可排序的列进行排序,方法是直接设置排序键。默认值为true。- 参数:
-
column- 在基础模型中启用或禁用排序的列 -
sortable- 指定的列是否可排序 - 抛出:
-
IndexOutOfBoundsException- 如果column超出模型的范围 - 参见:
-
isSortable
public boolean isSortable(int column) 返回指定列是否可排序。如果是,则返回true;否则返回false。- 参数:
-
column- 在基础模型中检查排序的列 - 返回:
- 如果列可排序,则返回true
- 抛出:
-
IndexOutOfBoundsException- 如果列超出底层模型的范围
-
setSortKeys
设置排序键。这将创建提供的List的副本;对提供的List的后续更改不会影响此DefaultRowSorter。如果排序键已更改,则会触发排序。- 指定者:
-
setSortKeys在类RowSorter<M>中 - 参数:
-
sortKeys- 新的SortKeys;null是指定空列表的一种简写,表示视图应为未排序状态 - 抛出:
-
IllegalArgumentException- 如果sortKeys中的任何值为null或具有超出模型范围的列索引
-
getSortKeys
返回当前的排序键。这将返回一个不可修改的非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) 如果为true,则指定在更新底层模型时应进行排序(调用rowsUpdated)。例如,如果为true,并且用户编辑条目,则该项目在视图中的位置可能会更改。默认值为false。- 参数:
-
sortsOnUpdates- 是否在更新事件上进行排序
-
getSortsOnUpdates
public boolean getSortsOnUpdates()如果在更新底层模型时应进行排序,则返回true;否则返回false。- 返回:
- 在模型更新时是否应进行排序
-
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) 返回在进行比较排序时是否将值转换为字符串。如果为true,则将使用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) 当行已从指定范围内的底层模型中删除时调用。参数给出了受影响范围的索引,并且是基于更改之前的模型。例如,如果您有一个包含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超出底层模型范围
-