- 类型参数:
-
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
Modifier and TypeClassDescriptionprotected static class
DefaultRowSorter.ModelWrapper
负责提供DefaultRowSorter
排序的数据。Nested classes/interfaces declared in class javax.swing.RowSorter
RowSorter.SortKey
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
当底层模型的内容完全更改时调用。int
convertRowIndexToModel
(int index) 返回index
在基础模型中的位置。int
convertRowIndexToView
(int index) 返回index
在视图中的位置。Comparator
<?> getComparator
(int column) 返回指定列的Comparator
。int
返回最大排序键数。final M
getModel()
返回底层模型。int
返回底层模型中的行数。protected final DefaultRowSorter.ModelWrapper
<M, I> 返回提供正在排序和过滤的数据的模型包装器。返回确定哪些行(如果有)应从视图中隐藏的过滤器。List
<? extends RowSorter.SortKey> 返回当前的排序键。boolean
如果在更新底层模型时应进行排序,则返回true;否则返回false。int
返回视图中的行数。boolean
isSortable
(int column) 如果指定的列可排序,则返回true;否则返回false。void
当底层模型结构完全更改时调用。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 final 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) 返回在进行排序时是否将值转换为字符串进行比较的结果。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
超出底层模型范围
-