模块  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的行,执行相反的操作:
      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上的Collator.getInstance()的结果。

    除了排序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 s列,当前排序顺序以及每列是否可排序。 默认排序顺序是自然的(与模型相同),默认情况下列可排序。

    TableRowSorter有一个正式的类型参数:模型的类型。 传递与您的模型完全对应的类型允许您根据您的模型进行过滤而无需进行投射。 有关此示例,请参阅RowFilter的文档。

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

    从以下版本开始:
    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则返回调用compareTo方法的私有Comparator 否则返回Collator.getInstance
        重写:
        getComparator在类 DefaultRowSorter<M extends TableModel,​Integer>
        参数
        column -列去取 Comparator了,在底层模型而言
        结果
        指定列的 Comparator
        异常
        IndexOutOfBoundsException - 如果列超出基础模型的范围
      • useToString

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