模块 java.desktop

类 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

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

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

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

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

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

如果基础模型结构发生变化(调用 modelStructureChanged 方法),以下内容将重置为其默认值:Comparator s by column、当前排序顺序以及每列是否可排序。要查找默认的 Comparator ,请参阅具体实现(例如, TableRowSorter )。默认排序顺序是未排序的(和模型一样),列默认是可排序的。

DefaultRowSorter 是一个抽象类。具体的子类必须通过调用 setModelWrapper 来提供对底层数据的访问。 setModelWrapper 方法必须在调用构造函数后立即调用,最好是从子类的构造函数中调用。如果您在未指定 ModelWrapper 的情况下使用 DefaultRowSorter,将导致未定义的行为。

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

自从:
1.6
参见:
  • 构造方法详细信息

    • DefaultRowSorter

      public DefaultRowSorter()
      创建一个空的 DefaultRowSorter
  • 方法详情

    • setModelWrapper

      protected final void setModelWrapper(DefaultRowSorter.ModelWrapper <M ,I > modelWrapper)
      设置提供正在排序和过滤的数据的模型包装器。
      参数:
      modelWrapper - 负责提供排序和过滤数据的模型包装器
      抛出:
      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 时检查指定值。通过直接设置排序键,仍然可以对已标记为不可排序的列进行排序。默认为真。
      参数:
      column - 根据基础模型启用或禁用排序的列
      sortable - 指定列是否可排序
      抛出:
      IndexOutOfBoundsException - 如果 column 超出模型范围
      参见:
    • isSortable

      public boolean isSortable(int column)
      如果指定的列是可排序的,则返回真;否则,假的。
      参数:
      column - 根据基础模型检查排序的列
      返回:
      如果该列是可排序的,则为真
      抛出:
      IndexOutOfBoundsException - 如果列超出基础模型的范围
    • setSortKeys

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

      public List <? extends RowSorter.SortKey > getSortKeys()
      返回当前排序键。这将返回一个不可修改的 non-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)
      如果为真,则指定在更新基础模型(调用rowsUpdated)时应该进行排序。例如,如果这是真的,并且用户编辑了一个条目,那么该条目在视图中的位置可能会改变。默认为假。
      参数:
      sortsOnUpdates - 是否对更新事件进行排序
    • getSortsOnUpdates

      public boolean getSortsOnUpdates()
      如果在更新基础模型时应该进行排序,则返回 true;否则,返回假。
      返回:
      模型更新时是否排序
    • 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)
      返回排序时是否在进行比较之前将值转换为字符串。如果为真,将使用 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)
      当已从指定范围(含)的基础模型中删除行时调用。

      参数给出了受影响范围的索引,并根据模型before改变。例如,如果您有一个 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 > endRowcolumn 超出基础模型的范围