模块 java.desktop

类 RowSorter<M>

java.lang.Object
javax.swing.RowSorter<M>
类型参数:
M - 底层模型的类型
已知子类:
DefaultRowSorter

public abstract class RowSorter<M> extends Object
RowSorter 提供排序和过滤的基础。除了创建和安装 RowSorter 之外,您很少需要直接与一个进行交互。 JTableRowSorter的具体实现请参考TableRowSorter

RowSorter 的主要作用是提供两个坐标系之间的映射:视图坐标系(例如 JTable )和基础数据源(通常是模型)的坐标系。

该视图在 RowSorter 上调用以下方法:

  • toggleSortOrder — 当发生适当的用户手势以触发排序时,视图调用它。例如,用户单击表格中的列标题。
  • 模型更改方法之一——当底层模型发生更改时,视图调用模型更改方法。事件的传递方式可能存在顺序依赖性,因此在调用这些方法之一之前,RowSorter 不应更新其映射。
因为视图广泛使用了 convertRowIndexToModelconvertRowIndexToViewgetViewRowCount 方法,所以这些方法需要快速。

RowSorter 通过 RowSorterListener 提供更改通知。发送两种类型的通知:

  • RowSorterEvent.Type.SORT_ORDER_CHANGED — 通知监听器排序顺序已更改。这之后通常会发出排序已更改的通知。
  • RowSorterEvent.Type.SORTED — 通知听众由 RowSorter 维护的映射已以某种方式更改。
RowSorter 实现通常没有与底层模型的一对一映射,但它们可以。例如,如果数据库进行排序,toggleSortOrder 可能会调用数据库(在后台线程上),并覆盖映射方法以返回传入的参数。

RowSorter 的具体实现需要参考模型,例如 TableModelListModel 。视图类(例如 JTableJList )也将引用模型。为避免排序依赖性,RowSorter 实现不应在模型上安装监听器。相反,视图类将在模型更改时调用 RowSorter。例如,如果在 TableModel 中更新了一行,则 JTable 调用 rowsUpdated。当模型发生变化时,视图可能会调用以下任何方法:modelStructureChangedallRowsChangedrowsInsertedrowsDeletedrowsUpdated

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

    • RowSorter

      public RowSorter()
      创建一个 RowSorter
  • 方法详情

    • getModel

      public abstract M  getModel()
      返回基础模型。
      返回:
      底层模型
    • toggleSortOrder

      public abstract void toggleSortOrder(int column)
      反转指定列的排序顺序。调用时由子类提供确切的行为。通常,如果指定的列已经是主要排序列,这会将排序顺序从升序反转为降序(或降序为升序);否则,使指定的列成为主要排序列,并按升序排序。如果指定的列不可排序,则此方法无效。

      如果这导致更改排序顺序和排序,将发送相应的 RowSorterListener 通知。

      参数:
      column - 根据基础模型切换排序顺序的列
      抛出:
      IndexOutOfBoundsException - 如果列超出基础模型的范围
    • convertRowIndexToModel

      public abstract int convertRowIndexToModel(int index)
      根据基础模型返回 index 的位置。也就是说,对于视图坐标中的行 index,这会根据基础模型返回行索引。
      参数:
      index - 就底层视图而言的行索引
      返回:
      根据视图的行索引
      抛出:
      IndexOutOfBoundsException - 如果 index 在视图范围之外
    • convertRowIndexToView

      public abstract int convertRowIndexToView(int index)
      根据视图返回 index 的位置。也就是说,对于基础模型坐标中的行 index,这将返回根据视图的行索引。
      参数:
      index - 就底层模型而言的行索引
      返回:
      根据视图的行索引,如果索引已从视图中过滤掉,则为 -1
      抛出:
      IndexOutOfBoundsException - 如果 index 超出模型范围
    • setSortKeys

      public abstract void setSortKeys(List <? extends RowSorter.SortKey > keys)
      设置当前排序键。
      参数:
      keys - 新的 SortKeysnull 是指定空列表的简写,表示视图应该是未排序的
    • getSortKeys

      public abstract List <? extends RowSorter.SortKey > getSortKeys()
      返回当前排序键。这必须返回一个 non-null List 并且可能返回一个不可修改的 List 。如果您需要更改排序键,请复制返回的 List ,改变副本并使用新列表调用 setSortKeys
      返回:
      当前排序顺序
    • getViewRowCount

      public abstract int getViewRowCount()
      返回视图中的行数。如果内容已被过滤,这可能与基础模型的行数不同。
      返回:
      视图中的行数
      参见:
    • getModelRowCount

      public abstract int getModelRowCount()
      返回基础模型中的行数。
      返回:
      基础模型中的行数
      参见:
    • modelStructureChanged

      public abstract void modelStructureChanged()
      当底层模型结构完全改变时调用。例如,如果 TableModel 中的列数发生变化,将调用此方法。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

    • allRowsChanged

      public abstract void allRowsChanged()
      当底层模型的内容完全改变时调用。表的结构是一样的,只是内容变了。这通常是在用其他方法来描述变化的成本太高时发送的。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

    • rowsInserted

      public abstract void rowsInserted(int firstRow, int endRow)
      在指定范围(含)内的基础模型中插入行时调用。

      参数给出受影响范围的索引。第一个参数是根据更改前的模型计算的,并且必须小于或等于更改前模型的大小。第二个参数是根据更改后的模型计算的,必须小于更改后模型的大小。例如,如果您有一个 5 行模型并将 3 个项目添加到模型的末尾,则索引为 5、7。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

      参数:
      firstRow - 第一行
      endRow - 最后一行
      抛出:
      IndexOutOfBoundsException - 如果任一参数无效,或者 firstRow > endRow
    • rowsDeleted

      public abstract void rowsDeleted(int firstRow, int endRow)
      当已从指定范围(含)的基础模型中删除行时调用。

      参数给出了受影响范围的索引,并根据模型before改变。例如,如果您有一个 5 行模型并从模型末尾删除 3 个项目,则索引为 2、4。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

      参数:
      firstRow - 第一行
      endRow - 最后一行
      抛出:
      IndexOutOfBoundsException - 如果任一参数在更改前超出模型范围,或者 firstRow > endRow
    • rowsUpdated

      public abstract void rowsUpdated(int firstRow, int endRow)
      当底层模型中的行在指定范围(含)之间发生更改时调用。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

      参数:
      firstRow - 第一行,就底层模型而言
      endRow - 最后一行,就底层模型而言
      抛出:
      IndexOutOfBoundsException - 如果任一参数超出基础模型的范围,或者 firstRow > endRow
    • rowsUpdated

      public abstract void rowsUpdated(int firstRow, int endRow, int column)
      当行中的列已在指定范围之间的基础模型中更新时调用。

      您通常不会调用此方法。此方法是公共的,以允许视图类调用它。

      参数:
      firstRow - 第一行,就底层模型而言
      endRow - 最后一行,就底层模型而言
      column - 已更改的列,就基础模型而言
      抛出:
      IndexOutOfBoundsException - 如果任一参数在更改后超出基础模型的范围,则 firstRow > endRowcolumn 超出基础模型的范围
    • addRowSorterListener

      public void addRowSorterListener(RowSorterListener  l)
      添加 RowSorterListener 以接收有关此 RowSorter 的通知。如果多次添加同一个监听器,它将收到多个通知。如果 lnull,什么都不做。
      参数:
      l - RowSorterListener
    • removeRowSorterListener

      public void removeRowSorterListener(RowSorterListener  l)
      删除 RowSorterListener 。如果 lnull,什么都不做。
      参数:
      l - RowSorterListener
    • fireSortOrderChanged

      protected void fireSortOrderChanged()
      通知监听排序顺序已更改。
    • fireRowSorterChanged

      protected void fireRowSorterChanged(int[] lastRowIndexToModel)
      通知监听映射已更改。
      参数:
      lastRowIndexToModel - 在排序之前从模型索引到视图索引的映射,可能是 null