- 类型参数:
-
M
- 底层模型的类型
- 直接已知子类:
-
DefaultRowSorter
RowSorter
提供了排序和过滤的基础。除了创建和安装一个RowSorter
之外,您很少需要直接与其交互。请参考JTable
的RowSorter
的具体实现TableRowSorter
。
RowSorter
的主要作用是提供两个坐标系之间的映射:视图的坐标系(例如JTable
)和底层数据源的坐标系,通常是一个模型。
视图在RowSorter
上调用以下方法:
toggleSortOrder
— 当适当的用户手势发生以触发排序时,视图会调用此方法。例如,用户在表格中单击列标题。- 模型更改方法之一 — 当底层模型发生更改时,视图会调用模型更改方法。事件传递的顺序可能存在顺序依赖性,因此在调用这些方法之一之前,
RowSorter
不应更新其映射。
convertRowIndexToModel
、convertRowIndexToView
和getViewRowCount
方法,因此这些方法需要快速。
RowSorter
通过RowSorterListener
提供更改通知。发送两种类型的通知:
RowSorterEvent.Type.SORT_ORDER_CHANGED
— 通知侦听器排序顺序已更改。通常会随后发送排序已更改的通知。RowSorterEvent.Type.SORTED
— 通知侦听器RowSorter
维护的映射以某种方式更改了。
RowSorter
实现通常不会与底层模型具有一对一的映射关系,但它们可以。例如,如果数据库执行排序,toggleSortOrder
可能会调用数据库(在后台线程上),并覆盖映射方法以返回传入的参数。
RowSorter
的具体实现需要引用诸如TableModel
或ListModel
之类的模型。视图类,例如JTable
和JList
,也将引用模型。为了避免排序依赖性,RowSorter
实现不应在模型上安装侦听器。相反,视图类在模型更改时将调用RowSorter
。例如,如果在TableModel
中更新了一行,JTable
会调用rowsUpdated
。当模型更改时,视图可能调用以下任何方法之一:modelStructureChanged
、allRowsChanged
、rowsInserted
、rowsDeleted
和rowsUpdated
。
- 自版本:
- 1.6
- 参见:
-
Nested Class Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
添加一个RowSorterListener
以接收有关此RowSorter
的通知。abstract void
在底层模型的内容完全更改时调用。abstract int
convertRowIndexToModel
(int index) 返回index
在底层模型中的位置。abstract int
convertRowIndexToView
(int index) 返回index
在视图中的位置。protected void
fireRowSorterChanged
(int[] lastRowIndexToModel) 通知侦听器映射已更改。protected void
通知侦听器排序顺序已更改。abstract M
getModel()
返回底层模型。abstract int
返回底层模型中的行数。abstract List
<? extends RowSorter.SortKey> 返回当前排序键。abstract int
返回视图中的行数。abstract void
在底层模型结构完全更改时调用。void
移除一个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) 反转指定列的排序顺序。
-
Constructor Details
-
RowSorter
public RowSorter()创建一个RowSorter
。
-
-
Method Details
-
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
设置当前排序键。- 参数:
-
keys
- 新的SortKeys
;null
是指定空列表的简写,表示视图应该未排序
-
getSortKeys
返回当前排序键。这必须返回一个非空List
,可能返回一个不可修改的List
。如果需要更改排序键,请复制返回的List
,修改副本并使用新列表调用setSortKeys
。- 返回:
- 当前排序顺序
-
getViewRowCount
public abstract int getViewRowCount()返回视图中的行数。如果内容已被过滤,则这可能与底层模型的行数不同。- 返回:
- 视图中的行数
- 参见:
-
getModelRowCount
public abstract int getModelRowCount()返回底层模型中的行数。- 返回:
- 底层模型中的行数
- 参见:
-
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
添加一个RowSorterListener
以接收有关此RowSorter
的通知。如果多次添加相同的侦听器,它将接收多个通知。如果l
为null
,则不执行任何操作。- 参数:
-
l
-RowSorterListener
-
removeRowSorterListener
移除一个RowSorterListener
。如果l
为null
,则不执行任何操作。- 参数:
-
l
-RowSorterListener
-
fireSortOrderChanged
protected void fireSortOrderChanged()通知侦听器排序顺序已更改。 -
fireRowSorterChanged
protected void fireRowSorterChanged(int[] lastRowIndexToModel) 通知侦听器映射已更改。- 参数:
-
lastRowIndexToModel
- 排序前从模型索引到视图索引的映射,可能为null
-