- java.lang.Object
-
- javax.swing.RowSorter<M>
-
- javax.swing.DefaultRowSorter<M,I>
-
- 参数类型
-
M
- 模型的类型 -
I
- 传递给RowFilter
的标识符的类型
- 已知直接子类:
-
TableRowSorter
public abstract class DefaultRowSorter<M,I> extends RowSorter<M>
一个RowSorter
的实现,它围绕网格数据模型提供排序和过滤。 除了创建和安装RowSorter
,您很少需要直接与一个人交互。 请参阅TableRowSorter
的具体实施RowSorter
为JTable
。按照当前的
SortKey
s进行排序。 如果两个对象相等(列的Comparator
返回0),则使用下一个SortKey
。 如果不存在SortKey
或订单是UNSORTED
,则使用模型中的行的顺序。每列的排序是通过
Comparator
,您可以使用setComparator
方法指定。 如果Comparator
尚未指定,则Comparator
由归国Collator.getInstance()
用在调用的结果toString
于底层对象。Comparator
从未通过null
。 Anull
值被视为在非null
值之前发生,并且两个null
值被视为相等。如果您指定一个
Comparator
,将其参数转换为模型提供的类型,则在数据排序时将抛出ClassCastException
。除了排序,
DefaultRowSorter
提供了过滤行的能力。 过滤通过的方式进行RowFilter
正在使用指定setRowFilter
方法。 如果没有指定过滤器,则包括所有行。默认情况下,行以未排序的顺序(与模型相同),每列可排序。 默认的
Comparator
被记录在子类中(例如,TableRowSorter
)。如果底层模型结构发生更改(调用了
modelStructureChanged
方法),则以下内容将重置为默认值:Comparator
按列,当前排序顺序以及每列是否可排序。 要查找默认的Comparator
s,请参阅具体实现(例如,TableRowSorter
)。 默认排序顺序是未排序的(与模型相同),列可默认排序。DefaultRowSorter
是一个抽象类。 具体的子类必须通过调用setModelWrapper
来提供对底层数据的setModelWrapper
。 在调用构造函数之后不久, 必须调用setModelWrapper
方法,理想情况下是从子类的构造函数中调用。 如果您使用DefaultRowSorter
而不指定ModelWrapper
则会导致未定义的行为。DefaultRowSorter
有两个正式类型参数。 第一个类型参数对应于模型的类,例如DefaultTableModel
。 第二个类型参数对应于传递给RowFilter
的标识符的类。 有关类型参数的更多详细信息,请参阅TableRowSorter
和RowFilter
。- 从以下版本开始:
- 1.6
- 另请参见:
-
TableRowSorter
,DefaultTableModel
,Collator
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 protected static class
DefaultRowSorter.ModelWrapper<M,I>
DefaultRowSorter.ModelWrapper
负责提供按DefaultRowSorter
进行排序的数据。-
Nested classes/interfaces inherited from class javax.swing.RowSorter
RowSorter.SortKey
-
-
构造方法摘要
构造方法 Constructor 描述 DefaultRowSorter()
创建一个空的DefaultRowSorter
。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 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; 否则,假。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)
返回在进行排序比较之前是否将该值转换为字符串。-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from class javax.swing.RowSorter
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
-
-
-
-
方法详细信息
-
setModelWrapper
protected final void setModelWrapper(DefaultRowSorter.ModelWrapper<M,I> modelWrapper)
设置提供正在排序和过滤的数据的模型包装器。- 参数
-
modelWrapper
- 模型包装器负责提供被分类和过滤的数据 - 异常
-
IllegalArgumentException
- 如果modelWrapper
是null
-
getModelWrapper
protected final DefaultRowSorter.ModelWrapper<M,I> getModelWrapper()
返回提供正在排序和过滤的数据的模型包装器。- 结果
- 模型包装器负责提供被分类和过滤的数据
-
setSortable
public void setSortable(int column, boolean sortable)
设置指定列是否可排序。 仅当调用toggleSortOrder
时,才会检查指定的值。 仍然可以通过直接设置排序键对已经标记为不可调整的列进行排序。 默认值为true。- 参数
-
column
- 根据底层模型启用或禁用排序的列 -
sortable
- 指定的列是否可排序 - 异常
-
IndexOutOfBoundsException
- 如果column
在模型的范围之外 - 另请参见:
-
toggleSortOrder(int)
,setSortKeys(java.util.List<? extends javax.swing.RowSorter.SortKey>)
-
isSortable
public boolean isSortable(int column)
如果指定的列是可排序的,则返回true; 否则,假。- 参数
-
column
- 根据底层模型检查排序的列 - 结果
- 如果列可排序,则为true
- 异常
-
IndexOutOfBoundsException
- 如果列超出了底层模型的范围
-
setSortKeys
public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
设置排序键。 这将创建提供的副本List
; 随后更改的List
不影响此DefaultRowSorter
。 如果排序键已更改,则会触发排序。- Specified by:
-
setSortKeys
在RowSorter<M>
- 参数
-
sortKeys
- 新SortKeys
;null
是指定空列表的缩写,表示视图应该是未排序的 - 异常
-
IllegalArgumentException
-如果有的话中的值的sortKeys
都为空或具有模式的范围之外的列索引
-
getSortKeys
public List<? extends RowSorter.SortKey> getSortKeys()
返回当前的排序键。 这返回一个不可修改的non-null List
。 如果您需要更改排序键,请复制返回的List
,并复制副本并使用新列表调用setSortKeys
。- Specified by:
-
getSortKeys
在RowSorter<M>
- 结果
- 当前排序顺序
-
setMaxSortKeys
public void setMaxSortKeys(int max)
设置最大排序键数。 排序键的数量确定排序时如何解析相等的值。 例如,假设创建了表行排序器,并setMaxSortKeys(2)
调用了setMaxSortKeys(2)
。 用户单击列1的标题,导致根据列1中的项排序表行。接下来,用户单击列2的标题,导致根据列2中的项排序表; 如果第2列中的任何项目相等,那么这些特定的行是根据第1列中的项目进行排序的。在这种情况下,我们说这些行主要在第2列中排序,其次是第1列。如果用户点击列3的标题,则这些项目主要在第3列上排序,并在第2列进行二次排序。由于使用setMaxSortKeys
将最大排序键数设置为2,setMaxSortKeys
列1不再对订单产生影响。最大排序键数由
toggleSortOrder
执行。 您可以通过直接调用setSortKeys
指定更多的排序键,并且它们都将被兑现。 但是,如果随后调用toggleSortOrder
,则将强制执行最大排序键数。 默认值为3。- 参数
-
max
- 最大排序键数 - 异常
-
IllegalArgumentException
- 如果max
<1
-
getMaxSortKeys
public int getMaxSortKeys()
返回最大排序键数。- 结果
- 最大排序键数
-
setSortsOnUpdates
public void setSortsOnUpdates(boolean sortsOnUpdates)
如果为true,则指定在更新底层模型时应进行排序(调用rowsUpdated
)。 例如,如果这是真的并且用户编辑一个条目,该视图中该项目的位置可能会改变。 默认值为false。- 参数
-
sortsOnUpdates
- 是否对更新事件进行排序
-
getSortsOnUpdates
public boolean getSortsOnUpdates()
如果在更新底层模型时发生排序,则返回true; 否则返回false。- 结果
- 是否在模型更新时进行排序
-
setRowFilter
public void setRowFilter(RowFilter<? super M,? super I> filter)
设置过滤器,确定哪些行(如果有)应从视图中隐藏。 过滤器在排序前应用。 值为null
表示应包含模型中的所有值。RowFilter
的include
方法传递了一个Entry
,它包装了底层模型。 在列数Entry
对应于列在数量ModelWrapper
。 标识符也来自ModelWrapper
。此方法触发排序。
- 参数
-
filter
- 用于确定应包括哪些条目的过滤器
-
getRowFilter
public RowFilter<? super M,? super I> getRowFilter()
返回确定哪些行(如果有的话)应该从视图中隐藏的过滤器。- 结果
- 过滤器
-
toggleSortOrder
public void toggleSortOrder(int column)
如果指定的列已经是主排序列,则将排序顺序从升序到降序(或降序升序)反转; 否则,使指定的列成为主排序列,具有升序的排序顺序。 如果指定的列不可排序,则此方法无效。- Specified by:
-
toggleSortOrder
在RowSorter<M>
- 参数
-
column
- 根据底层模型制作主排序列的列的索引 - 异常
-
IndexOutOfBoundsException
- 如果列超出了底层模型的范围 - 另请参见:
-
setSortable(int,boolean)
,setMaxSortKeys(int)
-
convertRowIndexToView
public int convertRowIndexToView(int index)
在视图方面返回index
的位置。 也就是说,对于底层模型的坐标中的行index
,返回视图的行索引。- Specified by:
-
convertRowIndexToView
在RowSorter<M>
- 参数
-
index
- 底层模型的行索引 - 结果
- 视图中的行索引,如果索引已从视图中过滤出来,则为-1
- 异常
-
IndexOutOfBoundsException
- 如果index
超出了模型的范围
-
convertRowIndexToModel
public int convertRowIndexToModel(int index)
根据底层模型返回index
的位置。 也就是说,对于视图坐标中的行index
,这将返回基于模型的行索引。- Specified by:
-
convertRowIndexToModel
在RowSorter<M>
- 参数
-
index
- 基础视图中的行索引 - 结果
- 行索引在视图方面
- 异常
-
IndexOutOfBoundsException
- 如果index
在视图的范围之外
-
sort
public void sort()
根据当前正在排序的列的排序键和与此排序器关联的过滤器(如果有),对视图中的行进行排序和过滤。 空的sortKeys
列表表示该视图应该未排序,与模型相同。
-
useToString
protected boolean useToString(int column)
返回在进行排序比较之前是否将该值转换为字符串。 如果真ModelWrapper.getStringValueAt
将被使用,否则ModelWrapper.getValueAt
将被使用。 它是由子类,比如TableRowSorter
,兑现他们这个值ModelWrapper
实现。- 参数
-
column
- 根据底层模型测试的列的索引 - 结果
- 如果在进行排序比较之前将值转换为字符串,则为true
- 异常
-
IndexOutOfBoundsException
- 如果column
无效
-
setComparator
public void setComparator(int column, Comparator<?> comparator)
设置Comparator
在排序指定列时使用。 这不会触发排序。 如果要在设置比较器后进行排序,则需要显式调用sort
。- 参数
-
column
- 根据底层模型,Comparator
列的索引将用于 -
comparator
- 要使用的Comparator
- 异常
-
IndexOutOfBoundsException
- 如果column
在底层模型的范围之外
-
getComparator
public Comparator<?> getComparator(int column)
返回指定列的Comparator
。 这将返回null
如果Comparator
尚未为列指定。- 参数
-
column
-列去取Comparator
的,在底层模型而言 - 结果
-
指定列的
Comparator
- 异常
-
IndexOutOfBoundsException
- 如果列超出了底层模型的范围
-
getViewRowCount
public int getViewRowCount()
返回视图中的行数。 如果内容已被过滤,这可能与底层模型的行数有所不同。- Specified by:
-
getViewRowCount
在RowSorter<M>
- 结果
- 视图中的行数
- 另请参见:
-
RowSorter.getModelRowCount()
-
getModelRowCount
public int getModelRowCount()
返回底层模型中的行数。- Specified by:
-
getModelRowCount
在RowSorter<M>
- 结果
- 底层模型中的行数
- 另请参见:
-
RowSorter.getViewRowCount()
-
modelStructureChanged
public void modelStructureChanged()
当底层模型结构完全改变时调用。 例如,如果TableModel
的列数更改,则将调用此方法。通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
modelStructureChanged
在RowSorter<M>
-
allRowsChanged
public void allRowsChanged()
当底层模型的内容完全改变时调用。 表的结构是一样的,只有内容已经改变了。 这通常是在太贵的情况下发送的,以表征其他方法的变化。通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
allRowsChanged
在RowSorter<M>
-
rowsInserted
public void rowsInserted(int firstRow, int endRow)
当行已经在指定范围(包括)中插入到底层模型中时调用。参数给出了影响范围的指标。 第一个参数是变更前的模型,并且必须小于或等于变更前的模型大小。 第二个参数是改变后的模型,必须小于变更后的模型大小。 例如,如果您有5行模型,并在模型的末尾添加3个项目,那么索引为5,7。
通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
rowsInserted
在RowSorter<M>
- 参数
-
firstRow
- 第一行 -
endRow
- 最后一行 - 异常
-
IndexOutOfBoundsException
- 如果任一参数无效,或firstRow
>endRow
-
rowsDeleted
public void rowsDeleted(int firstRow, int endRow)
当从指定范围(含)的底层模型中删除行时调用。这些参数给出了影响范围的指标,并且是在变化前的模型。 例如,如果您有5行模型,并从模型末尾删除3个项目,则索引为2,4。
通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
rowsDeleted
在RowSorter<M>
- 参数
-
firstRow
- 第一行 -
endRow
- 最后一行 - 异常
-
IndexOutOfBoundsException
- 如果任一参数超出变更前模型的范围,或者firstRow
>endRow
-
rowsUpdated
public void rowsUpdated(int firstRow, int endRow)
在基础模型中在指定范围(包括)之间更改行时调用。通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
rowsUpdated
在RowSorter<M>
- 参数
-
firstRow
- 第一行,在底层模型方面 -
endRow
- 根据底层模型的最后一行 - 异常
-
IndexOutOfBoundsException
- 如果任一参数超出了底层模型的范围,或者firstRow
>endRow
-
rowsUpdated
public void rowsUpdated(int firstRow, int endRow, int column)
当行中的列在指定范围内的底层模型中更新时调用。通常不会调用此方法。 这种方法是公开的,允许视图类调用它。
- Specified by:
-
rowsUpdated
在RowSorter<M>
- 参数
-
firstRow
- 第一行,在底层模型方面 -
endRow
- 根据底层模型的最后一行 -
column
- 在底层模型方面已经改变的列 - 异常
-
IndexOutOfBoundsException
- 如果任何一个参数在更改后的基础模型的范围之外,firstRow
endRow
或column
不在基础模型的范围之内
-
-