模块 java.desktop

类 TableRowSorter<M extends TableModel >

java.lang.Object
javax.swing.RowSorter <男>
javax.swing.DefaultRowSorter <M,Integer >
javax.swing.table.TableRowSorter<M>
类型参数:
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. 如果 setComparator 方法为该列指定了 Comparator,则使用它。
  2. 如果 getColumnClass 返回的列类是 String,则使用 Collator.getInstance() 返回的 Comparator
  3. 如果列类实现 Comparable,请使用调用 compareTo 方法的 Comparator
  4. 如果已指定 TableStringConverter,则使用它将值转换为 String s,然后使用 Collator.getInstance() 返回的 Comparator
  5. 否则使用 Collator.getInstance() 返回的 Comparator 对对象调用 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 s by column、当前排序顺序以及每列是否可排序。默认排序顺序是自然的(与模型相同),默认情况下列是可排序的。

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

WARNING:DefaultTableModel 返回 Object 的列类。因此,所有比较都将使用 toString 完成。这可能是不必要的昂贵。如果该列仅包含一种类型的值,例如 Integer ,您应该覆盖 getColumnClass 并返回适当的 Class 。这将显着提高此类的性能。

自从:
1.6
参见:
  • 构造方法详细信息

    • TableRowSorter

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

      public TableRowSorter(M  model)
      使用 model 作为基础 TableModel 创建一个 TableRowSorter
      参数:
      model - 要使用的底层 TableModelnull 被视为空模型
  • 方法详情

    • 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。如果未使用 setComparator 方法指定 Comparator,将根据指定列的列类 (TableModel.getColumnClass) 返回 Comparator。如果列类是 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 无效