Module java.desktop
Package javax.swing

Class DefaultRowSorter<M,I>

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之外,您很少需要直接与其交互。有关JTableRowSorter的具体实现,请参阅TableRowSorter

排序是基于当前SortKey按顺序进行的。如果两个对象相等(列的Comparator返回0),则使用下一个SortKey。如果没有剩余的SortKey或顺序为UNSORTED,则使用模型中的行的顺序。

每列的排序是通过您可以使用setComparator方法指定的Comparator完成的。如果未指定Comparator,则在调用基础对象的toString的结果上使用Collator.getInstance()返回的ComparatorComparator永远不会传递nullnull值被视为出现在非null值之前,并且两个null值被视为相等。

如果指定了将其参数转换为模型提供的类型之外的类型的Comparator,则在对数据进行排序时将抛出ClassCastException

除了排序,DefaultRowSorter还提供了过滤行的功能。过滤是通过使用setRowFilter方法指定的RowFilter完成的。如果未指定过滤器,则包括所有行。

默认情况下,行按未排序顺序排列(与模型相同),每列都是可排序的。默认的Comparator在子类中有文档记录(例如,TableRowSorter)。

如果底层模型结构发生更改(调用了modelStructureChanged方法),则以下内容将重置为其默认值:按列排序的Comparator、当前排序顺序以及每列是否可排序。要查找默认的Comparator,请参阅具体实现(例如,TableRowSorter)。默认排序顺序为未排序(与模型相同),默认情况下每列都是可排序的。

DefaultRowSorter是一个抽象类。具体的子类必须通过调用setModelWrapper来提供对基础数据的访问。最好在构造函数中调用setModelWrapper方法,否则将导致未定义的行为。

DefaultRowSorter有两个形式类型参数。第一个类型参数对应于模型的类,例如DefaultTableModel。第二个类型参数对应于传递给RowFilter的标识符的类。有关类型参数的更多详细信息,请参阅TableRowSorterRowFilter

自版本:
1.6
参见:
  • Constructor Details

    • DefaultRowSorter

      public DefaultRowSorter()
      创建一个空的DefaultRowSorter
  • Method Details

    • setModelWrapper

      protected final void setModelWrapper(DefaultRowSorter.ModelWrapper<M,I> modelWrapper)
      设置提供正在排序和过滤的数据的模型包装器。
      参数:
      modelWrapper - 负责提供将被DefaultRowSorter排序和过滤的数据的模型包装器
      抛出:
      IllegalArgumentException - 如果modelWrappernull
    • getModelWrapper

      protected final DefaultRowSorter.ModelWrapper<M,I> getModelWrapper()
      返回提供正在排序和过滤的数据的模型包装器。
      返回:
      负责提供将被排序和过滤的数据的模型包装器
    • getModel

      public final M getModel()
      返回底层模型。
      指定者:
      getModel 在类 RowSorter<M>
      返回:
      底层模型
    • 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

      public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)
      设置排序键。这将创建提供的List的副本;对提供的List的后续更改不会影响此DefaultRowSorter。如果排序键已更改,则会触发排序。
      指定者:
      setSortKeys 在类 RowSorter<M>
      参数:
      sortKeys - 新的SortKeysnull是指定空列表的一种简写,表示视图应为未排序状态
      抛出:
      IllegalArgumentException - 如果sortKeys中的任何值为null或具有超出模型范围的列索引
    • getSortKeys

      public List<? extends RowSorter.SortKey> 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

      public void setRowFilter(RowFilter<? super M,? super I> filter)
      设置确定哪些行(如果有)应从视图中隐藏的过滤器。过滤器在排序之前应用。值null表示应包括来自模型的所有值。

      RowFilterinclude方法传递了包装底层模型的EntryEntry中的列数对应于ModelWrapper中的列数。标识符也来自ModelWrapper

      此方法触发排序。

      参数:
      filter - 用于确定应包括哪些条目的过滤器
    • getRowFilter

      public RowFilter<? super M,? super I> 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

      public void setComparator(int column, Comparator<?> comparator)
      设置在对指定列进行排序时要使用的Comparator。这不会触发排序。如果设置了比较器后要进行排序,需要显式调用sort
      参数:
      column - 要为其使用Comparator的列的索引,以底层模型为准
      comparator - 要使用的Comparator
      抛出:
      IndexOutOfBoundsException - 如果column超出底层模型的范围
    • getComparator

      public Comparator<?> getComparator(int column)
      返回指定列的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 超出底层模型范围