java.lang.Object javax.swing.RowSorter<M> javax.swing.DefaultRowSorter<M,I>
M
- 模型的类型
I
- 传递给
RowFilter
的标识符类型
public abstract class DefaultRowSorter<M,I>
RowSorter
的一个实现,它围绕基于网格的数据模型提供排序和过滤操作。除了创建和安装 RowSorter
之外,几乎不需要直接与它交互。有关 JTable
的 RowSorter
具体实现,请参阅 TableRowSorter
。
排序操作依次根据当前的 SortKey
完成。如果两个对象相等(Comparator
对于列返回 0),则使用下一个 SortKey
。如果没有剩余的 SortKey
或者顺序为 UNSORTED
,则使用模型中行的顺序。
每一列的排序操作通过 Comparator
来完成,可以使用 setComparator
方法来指定 Comparator
。如果尚未指定 Comparator
,则先对底层对象调用 toString
,再对其结果调用 Collator.getInstance()
,使用所返回的 Comparator
。Comparator
不传递 null
。null
值被视为在非 null
值之前出现,两个 null
值被认为是相等的。
如果指定的 Comparator
将其参数强制转换为一个模型没有提供的类型,则对数据进行排序时将抛出 ClassCastException
。
除了排序操作,DefaultRowSorter
还提供过滤行的能力。过滤操作通过用 setRowFilter
方法指定的 RowFilter
来完成。如果没有指定过滤器,则包含所有行。
默认情况下,行是未排序的(与模型相同),每一列都是可排序的。默认的 Comparator
记录在子类中(例如,TableRowSorter
)。
如果底层模型结构更改(调用了 modelStructureChanged
方法),则以下内容被重置为默认值:按列的 Comparator
、当前排序顺序、每一列是否都是可排序的。要找到默认的 Comparator
,请参阅具体实现(例如,TableRowSorter
)。默认的排序顺序是未排序的(与模型相同),默认情况下列是可排序的。
如果底层模型结构更改(调用了 modelStructureChanged
方法),则以下内容被重置为默认值:按列的 Comparator
、当前排序顺序、某一列是否是可排序的。
DefaultRowSorter
是一个抽象类。通过调用 setModelWrapper
,具体子类必须提供对底层数据的访问。调用构造方法之后必须立即调用 setModelWrapper
方法,最好是从子类的构造方法中进行调用。如果使用 DefaultRowSorter
时没有指定 ModelWrapper
,则会导致不确定的行为。
DefaultRowSorter
有两种形式的类型参数。第一种类型参数对应于模型的类,例如 DefaultTableModel
。第二种类型参数对应于传递给 RowFilter
的标识符的类。有关类型参数的详细信息,请参阅 TableRowSorter
和 RowFilter
。
TableRowSorter
,
DefaultTableModel
,
Collator
嵌套类摘要 | |
---|---|
protected static class |
DefaultRowSorter.ModelWrapper<M,I> DefaultRowSorter.ModelWrapper 负责提供由 DefaultRowSorter 进行排序的数据。 |
从类 javax.swing.RowSorter 继承的嵌套类/接口 |
---|
RowSorter.SortKey |
构造方法摘要 | |
---|---|
DefaultRowSorter() 创建一个空 DefaultRowSorter 。 |
方法摘要 | |
---|---|
void |
allRowsChanged() 当底层模型的内容完全更改时,调用此方法。 |
int |
convertRowIndexToModel(int index) 返回基于底层模型的 index 的位置。 |
int |
convertRowIndexToView(int index) 返回基于视图 index 的位置。 |
Comparator<?> |
getComparator(int column) 返回指定列的 Comparator 。 |
int |
getMaxSortKeys() 返回排序键的最大数量。 |
M |
getModel() 返回底层模型。 |
int |
getModelRowCount() 返回底层模型中的行数。 |
protected DefaultRowSorter.ModelWrapper<M,I> |
getModelWrapper() 返回模型包装器,它提供将要进行排序和过滤的数据。 |
RowFilter<? super M,? super I> |
getRowFilter() 返回用于确定哪些行(如果有)应该在视图中隐藏的过滤器。 |
List<? extends RowSorter.SortKey> |
getSortKeys() 返回当前排序键。 |
boolean |
getSortsOnUpdates() 如果底层模型更新时应该进行排序,则返回 true;否则返回 false。 |
int |
getViewRowCount() 返回视图中的行数。 |
boolean |
isSortable(int column) 如果指定的列可排序,则返回 true;否则返回 false。 |
void |
modelStructureChanged() 当底层模型结构完全更改时,调用此方法。 |
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 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) 返回排序过程中进行比较之前是否要将值转换为字符串。 |
从类 javax.swing.RowSorter 继承的方法 |
---|
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
public DefaultRowSorter()
DefaultRowSorter
。
方法详细信息 |
---|
protected final void setModelWrapper(DefaultRowSorter.ModelWrapper<M,I> modelWrapper)
modelWrapper
- 负责提供要进行排序和过滤的数据的模型包装器
IllegalArgumentException
- 如果
modelWrapper
为
null
protected final DefaultRowSorter.ModelWrapper<M,I> getModelWrapper()
public final M getModel()
public void setSortable(int column, boolean sortable)
toggleSortOrder
时才检查指定的值。通过直接设置排序键,仍然可以对已标记为不可排序的列进行排序。默认值为 true。
column
- 要启用排序或禁用排序的列,就底层模型而言
sortable
- 指定的列是否可排序
IndexOutOfBoundsException
- 如果
column
超出模型的范围
toggleSortOrder(int)
,
setSortKeys(java.util.List
)
public boolean isSortable(int column)
column
- 要检查排序的列,就底层模型而言
IndexOutOfBoundsException
- 如果
column
超出底层模型的范围
public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
List
的一个副本;对所提供
List
的后续更改不影响此
DefaultRowSorter
。如果排序键已更改,则此方法触发一个排序。
RowSorter<M>
中的
setSortKeys
sortKeys
- 新的
SortKey
;
null
是指定一个空列表的简单表示方法,表示视图应该是未排序的。
IllegalArgumentException
- 如果
sortKey
中的任一值为 null,或者有超出模型范围的列索引
public List<? extends RowSorter.SortKey> getSortKeys()
非 null List
。如果需要更改排序键,可创建所返回
List
的一个副本,更改该副本并使用新列表调用
setSortKeys
。
RowSorter<M>
中的
getSortKeys
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
public int getMaxSortKeys()
public void setSortsOnUpdates(boolean sortsOnUpdates)
rowsUpdated
)时进行排序。例如,如果为 true 并且用户编辑了一个条目,则该项在视图中的位置可能改变。默认值为 false。
sortsOnUpdates
- 是否在发生更新事件时进行排序
public boolean getSortsOnUpdates()
public void setRowFilter(RowFilter<? super M,? super I> filter)
null
值表示应该包括模型中的所有值。
将包装底层模型的 Entry
传递给 RowFilter
的 include
方法。Entry
的列数对应于 ModelWrapper
的列数。标识符也取自该 ModelWrapper
。
此方法将触发排序。
filter
- 用于确定应该包括哪些条目的过滤器
public RowFilter<? super M,? super I> getRowFilter()
public void toggleSortOrder(int column)
RowSorter<M>
中的
toggleSortOrder
column
- 要变为主要排序列的列索引,就底层模型而言
IndexOutOfBoundsException
- 如果列超出底层模型的范围
setSortable(int,boolean)
,
setMaxSortKeys(int)
public int convertRowIndexToView(int index)
index
的位置。也就是说,对于底层模型坐标中的行
index
,此方法返回基于视图的行索引。
RowSorter<M>
中的
convertRowIndexToView
index
- 基于底层模型的行索引
IndexOutOfBoundsException
- 如果
index
超出模型的范围
public int convertRowIndexToModel(int index)
index
的位置。也就是说,对于视图坐标中的行
index
,此方法返回基于底层模型的行索引。
RowSorter<M>
中的
convertRowIndexToModel
index
- 基于底层视图的行索引
IndexOutOfBoundsException
- 如果
index
超出视图的范围
public void sort()
sortKeys
列表表示视图应该未排序,与模型相同。
protected boolean useToString(int column)
ModelWrapper.getStringValueAt
;否则,将使用
ModelWrapper.getValueAt
。由子类(比如
TableRowSorter
)决定是否在其
ModelWrapper
实现中遵守此值。
column
- 要测试的列的索引,就底层模型而言
IndexOutOfBoundsException
- 如果
column
无效
public void setComparator(int column, Comparator<?> comparator)
Comparator
。此方法不会触发排序。如果想要在设置比较器之后进行排序,则需要显式地调用
sort
。
column
- 要应用
Comparator
的列的索引,就底层模型而言
comparator
- 要使用的
Comparator
IndexOutOfBoundsException
- 如果
column
超出底层模型的范围
public Comparator<?> getComparator(int column)
Comparator
。如果没有为列指定
Comparator
,则此方法将返回
null
。
column
- 要获取
Comparator
的列,就底层模型而言
Comparator
IndexOutOfBoundsException
- 如果
column
超出底层模型的范围
public int getViewRowCount()
RowSorter<M>
中的
getViewRowCount
RowSorter.getModelRowCount()
public int getModelRowCount()
RowSorter<M>
中的
getModelRowCount
RowSorter.getViewRowCount()
public void modelStructureChanged()
TableModel
中的列数发生了更改,则此方法将被调用。
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
modelStructureChanged
public void allRowsChanged()
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
allRowsChanged
public void rowsInserted(int firstRow, int endRow)
参数指定有效范围的索引。第一个参数是基于更改之前的模型的,必须小于等于更改之前的模型的大小。第二个参数是基于更改之后的模型的,必须小于更改之后的模型的大小。例如,如果有一个 5 行的模型并在该模型的尾部添加 3 个项,则其索引为 5、7。
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
rowsInserted
firstRow
- 第一行
endRow
- 最后一行
IndexOutOfBoundsException
- 如果任一参数无效,或者
firstRow
>
endRow
public void rowsDeleted(int firstRow, int endRow)
参数指定有效范围的索引,其基于更改之前的模型。例如,如果有一个 5 行的模型并从模型的尾部删除 3 个项,则其索引为 2、4。
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
rowsDeleted
firstRow
- 第一行
endRow
- 最后一行
IndexOutOfBoundsException
- 如果任一参数超出模型更改之前的范围,或者
firstRow
>
endRow
public void rowsUpdated(int firstRow, int endRow)
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
rowsUpdated
firstRow
- 第一行,就底层模型而言
endRow
- 最后一行,就底层模型而言
IndexOutOfBoundsException
- 如果任一参数超出模型更改之前的范围,或者
firstRow
>
endRow
public void rowsUpdated(int firstRow, int endRow, int column)
通常不调用此方法。此方法是公共的,允许视图类调用它。
RowSorter<M>
中的
rowsUpdated
firstRow
- 第一行,就底层模型而言
endRow
- 最后一行,就底层模型而言
column
- 已更改的列,就底层模型而言
IndexOutOfBoundsException
- 如果任一参数超出底层模型更改之后的范围,
firstRow
>
endRow
或者
column
超出底层模型的范围