Module  java.desktop
软件包  javax.swing

Class DefaultRowSorter<M,I>

  • 参数类型
    M - 模型的类型
    I - 传递给 RowFilter的标识符的类型
    已知直接子类:
    TableRowSorter


    public abstract class DefaultRowSorter<M,I>
    extends RowSorter<M>
    一个RowSorter的实现,它围绕网格数据模型提供排序和过滤。 除了创建和安装RowSorter ,您很少需要直接与一个人交互。 请参阅TableRowSorter的具体实施RowSorterJTable

    按照当前的SortKey s进行排序。 如果两个对象相等(列的Comparator返回0),则使用下一个SortKey 如果不存在SortKey或订单是UNSORTED ,则使用模型中的行的顺序。

    每列的排序是通过Comparator ,您可以使用setComparator方法指定。 如果Comparator尚未指定,则Comparator由归国Collator.getInstance()用在调用的结果toString于底层对象。 Comparator从未通过null A null值被视为在非null值之前发生,并且两个null值被视为相等。

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

    除了排序, DefaultRowSorter提供了过滤行的能力。 过滤通过的方式进行RowFilter正在使用指定setRowFilter方法。 如果没有指定过滤器,则包括所有行。

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

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

    DefaultRowSorter是一个抽象类。 具体的子类必须通过调用setModelWrapper来提供对底层数据的setModelWrapper 在调用构造函数之后不久, 必须调用setModelWrapper方法,理想情况下是从子类的构造函数中调用。 如果您使用DefaultRowSorter而不指定ModelWrapper则会导致未定义的行为。

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

    从以下版本开始:
    1.6
    另请参见:
    TableRowSorterDefaultTableModelCollator
    • 构造方法详细信息

      • 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​()
        返回底层模型。
        Specified by:
        getModelRowSorter<M>
        结果
        底层模型
      • isSortable

        public boolean isSortable​(int column)
        如果指定的列是可排序的,则返回true; 否则,假。
        参数
        column - 根据底层模型检查排序的列
        结果
        如果列可排序,则为true
        异常
        IndexOutOfBoundsException - 如果列超出了底层模型的范围
      • setSortKeys

        public void setSortKeys​(List<? extends RowSorter.SortKey> sortKeys)
        设置排序键。 这将创建提供的副本List ; 随后更改的List不影响此DefaultRowSorter 如果排序键已更改,则会触发排序。
        Specified by:
        setSortKeysRowSorter<M>
        参数
        sortKeys - 新SortKeys ; null是指定空列表的缩写,表示视图应该是未排序的
        异常
        IllegalArgumentException -如果有的话中的值的 sortKeys都为空或具有模式的范围之外的列索引
      • getSortKeys

        public List<? extends RowSorter.SortKey> getSortKeys​()
        返回当前的排序键。 这返回一个不可修改的non-null List 如果您需要更改排序键,请复制返回的List ,并复制副本并使用新列表调用setSortKeys
        Specified by:
        getSortKeysRowSorter<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表示应包含模型中的所有值。

        RowFilterinclude方法传递了一个Entry ,它包装了底层模型。 在列数Entry对应于列在数量ModelWrapper 标识符也来自ModelWrapper

        此方法触发排序。

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

        public RowFilter<? super M,? super I> getRowFilter​()
        返回确定哪些行(如果有的话)应该从视图中隐藏的过滤器。
        结果
        过滤器
      • toggleSortOrder

        public void toggleSortOrder​(int column)
        如果指定的列已经是主排序列,则将排序顺序从升序到降序(或降序升序)反转; 否则,使指定的列成为主排序列,具有升序的排序顺序。 如果指定的列不可排序,则此方法无效。
        Specified by:
        toggleSortOrderRowSorter<M>
        参数
        column - 根据底层模型制作主排序列的列的索引
        异常
        IndexOutOfBoundsException - 如果列超出了底层模型的范围
        另请参见:
        setSortable(int,boolean)setMaxSortKeys(int)
      • convertRowIndexToView

        public int convertRowIndexToView​(int index)
        在视图方面返回index的位置。 也就是说,对于底层模型的坐标中的行index ,返回视图的行索引。
        Specified by:
        convertRowIndexToViewRowSorter<M>
        参数
        index - 底层模型的行索引
        结果
        视图中的行索引,如果索引已从视图中过滤出来,则为-1
        异常
        IndexOutOfBoundsException - 如果 index超出了模型的范围
      • convertRowIndexToModel

        public int convertRowIndexToModel​(int index)
        根据底层模型返回index的位置。 也就是说,对于视图坐标中的行index ,这将返回基于模型的行索引。
        Specified by:
        convertRowIndexToModelRowSorter<M>
        参数
        index - 基础视图中的行索引
        结果
        行索引在视图方面
        异常
        IndexOutOfBoundsException - 如果 index在视图的范围之外
      • 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:
        getViewRowCountRowSorter<M>
        结果
        视图中的行数
        另请参见:
        RowSorter.getModelRowCount()
      • modelStructureChanged

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

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        modelStructureChangedRowSorter<M>
      • allRowsChanged

        public void allRowsChanged​()
        当底层模型的内容完全改变时调用。 表的结构是一样的,只有内容已经改变了。 这通常是在太贵的情况下发送的,以表征其他方法的变化。

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        allRowsChangedRowSorter<M>
      • rowsInserted

        public void rowsInserted​(int firstRow,
                                 int endRow)
        当行已经在指定范围(包括)中插入到底层模型中时调用。

        参数给出了影响范围的指标。 第一个参数是变更前的模型,并且必须小于或等于变更前的模型大小。 第二个参数是改变后的模型,必须小于变更后的模型大小。 例如,如果您有5行模型,并在模型的末尾添加3个项目,那么索引为5,7。

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        rowsInsertedRowSorter<M>
        参数
        firstRow - 第一行
        endRow - 最后一行
        异常
        IndexOutOfBoundsException - 如果任一参数无效,或 firstRow > endRow
      • rowsDeleted

        public void rowsDeleted​(int firstRow,
                                int endRow)
        当从指定范围(含)的底层模型中删除行时调用。

        这些参数给出了影响范围的指标,并且是在变化的模型。 例如,如果您有5行模型,并从模型末尾删除3个项目,则索引为2,4。

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        rowsDeletedRowSorter<M>
        参数
        firstRow - 第一行
        endRow - 最后一行
        异常
        IndexOutOfBoundsException - 如果任一参数超出变更前模型的范围,或者 firstRow > endRow
      • rowsUpdated

        public void rowsUpdated​(int firstRow,
                                int endRow)
        在基础模型中在指定范围(包括)之间更改行时调用。

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        rowsUpdatedRowSorter<M>
        参数
        firstRow - 第一行,在底层模型方面
        endRow - 根据底层模型的最后一行
        异常
        IndexOutOfBoundsException - 如果任一参数超出了底层模型的范围,或者 firstRow > endRow
      • rowsUpdated

        public void rowsUpdated​(int firstRow,
                                int endRow,
                                int column)
        当行中的列在指定范围内的底层模型中更新时调用。

        通常不会调用此方法。 这种方法是公开的,允许视图类调用它。

        Specified by:
        rowsUpdatedRowSorter<M>
        参数
        firstRow - 第一行,在底层模型方面
        endRow - 根据底层模型的最后一行
        column - 在底层模型方面已经改变的列
        异常
        IndexOutOfBoundsException - 如果任何一个参数在更改后的基础模型的范围之外, firstRow endRowcolumn不在基础模型的范围之内