Module java.desktop
Package javax.swing

Class 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
参见:
  • Constructor Details

    • RowSorter

      public RowSorter()
      创建一个RowSorter
  • Method Details

    • 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()
      返回当前排序键。这必须返回一个非空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)
      在指定范围内(包括)从底层模型中删除行时调用。

      参数给出受影响范围的索引,以底层模型更改之前的模型为准。例如,如果您有一个包含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 > endRow,或 column 超出基础模型范围
    • 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