Module  java.desktop
软件包  javax.swing.table

Class TableRowSorter<M extends TableModel>

  • 参数类型
    M - 模型的类型,必须是 TableModel的实现


    public class TableRowSorter<M extends TableModel>
    extends DefaultRowSorter<M,Integer>
    RowSorter一个实现,它使用TableModel排序和过滤。 以下示例显示将排序添加到JTable
      TableModel myModel = createMyTableModel();
       JTable table = new JTable(myModel);
       table.setRowSorter(new TableRowSorter(myModel)); 
    这将执行所有布线,使得当用户执行适当的手势时,例如单击列标题,表将进行视觉分类。

    JTable的基于行的方法和JTable的选择模型参考视图而不是底层模型。 因此,有必要在两者之间进行转换。 例如,要获得myModel的选择,您需要转换索引:

      int[] selection = table.getSelectedRows();
       for (int i = 0; i < selection.length; i++) {
         selection[i] = table.convertRowIndexToModel(selection[i]);
       } 
    类似地,在JTable根据底层模型的坐标来选择一行, JTable
      table.setRowSelectionInterval(table.convertRowIndexToView(row),
                                     table.convertRowIndexToView(row)); 

    上一个示例假设您尚未启用过滤。 如果您启用过滤功能convertRowIndexToView将为视图中不可见的位置返回-1。

    TableRowSorter使用Comparator进行比较。 以下定义如何为列选择Comparator

    1. 如果Comparator已经为列由指定setComparator方法,使用它。
    2. 如果由getColumnClass返回的列类是String ,请使用Comparator返回的Collator.getInstance()
    3. 如果列类实现Comparable ,使用Comparator调用该compareTo方法。
    4. 如果指定了TableStringConverter ,请使用它将值转换为String s,然后使用Comparator返回的Collator.getInstance()
    5. 否则使用Comparator返回的Collator.getInstance()对结果从调用toString上的对象。

    除了排序TableRowSorter提供了过滤的能力。 使用setFilter方法指定过滤器。 以下示例将仅显示包含字符串“foo”的行:

      TableModel myModel = createMyTableModel();
       TableRowSorter sorter = new TableRowSorter(myModel);
       sorter.setRowFilter(RowFilter.regexFilter(".*foo.*"));
       JTable table = new JTable(myModel);
       table.setRowSorter(sorter); 

    如果底层模型结构发生更改(调用了modelStructureChanged方法),则按照列,当前排序顺序以及每列是否可排序,将以下内容重置为默认值: Comparator 默认排序顺序是自然的(与模型相同),列可默认排序。

    TableRowSorter具有一个正式类型参数:模型的类型。 传递一个与您的模型完全对应的类型,可以根据您的模型进行过滤,而无需转换。 请参阅RowFilter的文档以获得一个示例。

    警告: DefaultTableModel返回列类为Object 因此,所有比较将使用toString 这可能是不必要的昂贵的。 如果列只包含一种类型的值,例如Integer ,则应该覆盖getColumnClass并返回相应的Class 这将大大提高这个类的性能。

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

      • TableRowSorter

        public TableRowSorter​()
        创建一个空的模型 TableRowSorter
      • TableRowSorter

        public TableRowSorter​(M model)
        创建 TableRowSorter使用 model作为底层的 TableModel
        参数
        model -底层 TableModel使用, null被视为空模型
    • 方法详细信息

      • setModel

        public void setModel​(M model)
        设置TableModel ,以作为该底层模型使用TableRowSorter 可以使用值null来设置空模型。
        参数
        model - 使用的基础模型,或 null
      • setStringConverter

        public void setStringConverter​(TableStringConverter stringConverter)
        设置负责将值从模型转换为字符串的对象。 如果非null这是用来转换任何对象值,没有注册Comparator ,为字符串。
        参数
        stringConverter - 负责将值从模型转换为字符串的对象
      • getStringConverter

        public TableStringConverter getStringConverter​()
        返回负责将值从模型转换为字符串的对象。
        结果
        负责将值转换为字符串的对象。
      • getComparator

        public Comparator<?> getComparator​(int column)
        返回指定列的Comparator 如果Comparator尚未使用指定setComparator方法的Comparator将基于列类(被返回TableModel.getColumnClass指定列的)。 如果列类为String ,则返回Collator.getInstance 如果列类实现Comparable私人Comparator返回调用该compareTo方法。 否则返回Collator.getInstance
        重写:
        getComparatorDefaultRowSorter<M extends TableModel,Integer>
        参数
        column -列去取 Comparator的,在底层模型而言
        结果
        指定列的 Comparator
        异常
        IndexOutOfBoundsException - 如果列超出了底层模型的范围
      • useToString

        protected boolean useToString​(int column)
        返回在进行排序比较之前是否将该值转换为字符串。 如果真正使用ModelWrapper.getStringValueAt ,否则将使用ModelWrapper.getValueAt 它是由子类,比如TableRowSorter ,兑现他们这个值ModelWrapper实现。
        重写:
        useToStringDefaultRowSorter<M extends TableModel,Integer>
        参数
        column - 根据底层模型测试的列的索引
        结果
        如果在进行排序比较之前将值转换为字符串,则为true
        异常
        IndexOutOfBoundsException - 如果 column无效