java.lang.Object javax.swing.RowSorter<M>
M
- 底层模型的类型
public abstract class RowSorter<M>
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
。
TableRowSorter
嵌套类摘要 | |
---|---|
static class |
RowSorter.SortKey SortKey 描述特定列的排序顺序。 |
构造方法摘要 | |
---|---|
RowSorter() 创建一个 RowSorter 。 |
方法摘要 | |
---|---|
void |
addRowSorterListener(RowSorterListener l) 添加一个 RowSorterListener 来接收有关此 RowSorter 的通知。 |
abstract void |
allRowsChanged() 当底层模型的内容完全更改时,调用此方法。 |
abstract int |
convertRowIndexToModel(int index) 返回基于底层模型的 index 的位置。 |
abstract int |
convertRowIndexToView(int index) 返回基于视图 index 的位置。 |
protected void |
fireRowSorterChanged(int[] lastRowIndexToModel) 通知侦听器映射关系发生了更改。 |
protected void |
fireSortOrderChanged() 通知侦听器排序顺序发生了更改。 |
abstract M |
getModel() 返回底层模型。 |
abstract int |
getModelRowCount() 返回底层模型中的行数。 |
abstract List<? extends RowSorter.SortKey> |
getSortKeys() 返回当前排序键。 |
abstract int |
getViewRowCount() 返回视图中的行数。 |
abstract void |
modelStructureChanged() 当底层模型结构完全更改时,调用此方法。 |
void |
removeRowSorterListener(RowSorterListener l) 移除一个 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) 颠倒指定列的排序顺序。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
public RowSorter()
RowSorter
。
方法详细信息 |
---|
public abstract M getModel()
public abstract void toggleSortOrder(int column)
如果此方法导致更改排序顺序和排序操作,则它将发送适当的 RowSorterListener
通知。
column
- 要切换排序顺序的列,就底层模型而言
IndexOutOfBoundsException
- 如果列超出底层模型的范围
public abstract int convertRowIndexToModel(int index)
index
的位置。也就是说,对于视图坐标中的行
index
,此方法返回基于底层模型的行索引。
index
- 基于底层视图的行索引
IndexOutOfBoundsException
- 如果
index
超出视图的范围
public abstract int convertRowIndexToView(int index)
index
的位置。也就是说,对于底层模型坐标中的行
index
,此方法返回基于视图的行索引。
index
- 基于底层模型的行索引
IndexOutOfBoundsException
- 如果
index
超出模型的范围
public abstract void setSortKeys(List<? extends RowSorter.SortKey> keys)
keys
- 新的
SortKeys
;
null
是指定一个空列表的简写,表示视图应该是未排序的。
public abstract List<? extends RowSorter.SortKey> getSortKeys()
非 null List
,可以返回一个无法修改的
List
。如果需要更改排序键,可创建所返回
List
的一个副本,更改该副本并使用新列表调用
setSortKeys
。
public abstract int getViewRowCount()
getModelRowCount()
public abstract int getModelRowCount()
getViewRowCount()
public abstract void modelStructureChanged()
TableModel
中的列数发生了更改,则此方法将被调用。
通常不调用此方法。此方法是公共的,允许视图类调用它。
public abstract void allRowsChanged()
通常不调用此方法。此方法是公共的,允许视图类调用它。
public abstract void rowsInserted(int firstRow, int endRow)
参数指定有效范围的索引。第一个参数是基于更改之前的模型的,必须小于等于更改之前的模型的大小。第二个参数是基于更改之后的模型的,必须小于更改之后的模型的大小。例如,如果有一个 5 行的模型并在该模型的尾部添加 3 个项,则其索引为 5、7。
通常不调用此方法。此方法是公共的,允许视图类调用它。
firstRow
- 第一行
endRow
- 最后一行
IndexOutOfBoundsException
- 如果任一参数无效,或者
firstRow
>
endRow
public abstract void rowsDeleted(int firstRow, int endRow)
参数指定有效范围的索引,其基于更改之前的模型。例如,如果有一个 5 行的模型并从模型的尾部删除 3 个项,则其索引为 2、4。
通常不调用此方法。此方法是公共的,允许视图类调用它。
firstRow
- 第一行
endRow
- 最后一行
IndexOutOfBoundsException
- 如果任一参数超出模型更改之前的范围,或者
firstRow
>
endRow
public abstract void rowsUpdated(int firstRow, int endRow)
通常不调用此方法。此方法是公共的,允许视图类调用它。
firstRow
- 第一行,就底层模型而言
endRow
- 最后一行,就底层模型而言
IndexOutOfBoundsException
- 如果任一参数超出模型更改之前的范围,或者
firstRow
>
endRow
public abstract void rowsUpdated(int firstRow, int endRow, int column)
通常不调用此方法。此方法是公共的,允许视图类调用它。
firstRow
- 第一行,就底层模型而言
endRow
- 最后一行,就底层模型而言
column
- 已更改的列,就底层模型而言
IndexOutOfBoundsException
- 如果任一参数超出底层模型更改之后的范围,
firstRow
>
endRow
或者
column
超出底层模型的范围
public void addRowSorterListener(RowSorterListener l)
RowSorterListener
来接收有关此
RowSorter
的通知。如果多次添加相同的侦听器,则它将接收多个通知。如果
l
为
null
,则不执行任何操作。
l
-
RowSorterListener
public void removeRowSorterListener(RowSorterListener l)
RowSorterListener
。如果
l
为
null
,则不执行任何操作。
l
-
RowSorterListener
protected void fireSortOrderChanged()
protected void fireRowSorterChanged(int[] lastRowIndexToModel)
lastRowIndexToModel
- 模型索引到排序之前视图索引的映射关系,可以为
null