Module java.desktop

Class TableRowSorter<M extends TableModel>

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

public class TableRowSorter<M extends TableModel> extends DefaultRowSorter<M,Integer>
提供使用 TableModel 进行排序和过滤的 RowSorter 实现。以下示例展示了如何向 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. 如果通过 setComparator 方法为列指定了 Comparator,则使用它。
  2. 如果由 getColumnClass 返回的列类是 String,则使用由 Collator.getInstance() 返回的 Comparator
  3. 如果列类实现了 Comparable,则使用调用 compareTo 方法的 Comparator
  4. 如果已指定了 TableStringConverter,则使用它将值转换为 String,然后使用由 Collator.getInstance() 返回的 Comparator
  5. 否则,对对象调用 toString 的结果上使用由 Collator.getInstance() 返回的 Comparator

除了排序,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。这将大大提高此类的性能。

自 JDK 版本:
1.6
参见:
  • Constructor Details

    • TableRowSorter

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

      public TableRowSorter(M model)
      使用 model 作为底层 TableModel 创建一个 TableRowSorter
      参数:
      model - 要使用的底层 TableModelnull 被视为空模型
  • Method Details

    • setModel

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

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

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

      public Comparator<?> getComparator(int column)
      返回指定列的 Comparator。如果未使用 setComparator 方法指定 Comparator,则将根据指定列的列类(TableModel.getColumnClass)返回 Comparator。如果列类是 String,则返回 Collator.getInstance。如果列类实现了 Comparable,则返回一个私有的 Comparator,调用 compareTo 方法。否则返回 Collator.getInstance
      覆盖:
      getComparator 在类 DefaultRowSorter<M extends TableModel,Integer>
      参数:
      column - 要获取 Comparator 的列,以底层模型为准
      返回:
      指定列的 Comparator
      抛出:
      IndexOutOfBoundsException - 如果列超出底层模型的范围
    • useToString

      protected boolean useToString(int column)
      返回在排序时是否将值转换为字符串进行比较。如果为 true,则将使用 ModelWrapper.getStringValueAt,否则将使用 ModelWrapper.getValueAt。子类(如 TableRowSorter)需要在其 ModelWrapper 实现中遵守此值。
      覆盖:
      useToString 在类 DefaultRowSorter<M extends TableModel,Integer>
      参数:
      column - 要测试的列的索引,以底层模型为准
      返回:
      如果在排序时要将值转换为字符串进行比较,则为 true
      抛出:
      IndexOutOfBoundsException - 如果 column 无效