java.lang.Object
javax.swing.RowSorter<M>
javax.swing.DefaultRowSorter<M,Integer>
javax.swing.table.TableRowSorter<M>
- 类型参数:
-
M
- 模型的类型,必须是TableModel
的实现
提供使用
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
:
- 如果通过
setComparator
方法为列指定了Comparator
,则使用它。 - 如果由
getColumnClass
返回的列类是String
,则使用由Collator.getInstance()
返回的Comparator
。 - 如果列类实现了
Comparable
,则使用调用compareTo
方法的Comparator
。 - 如果已指定了
TableStringConverter
,则使用它将值转换为String
,然后使用由Collator.getInstance()
返回的Comparator
。 - 否则,对对象调用
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
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in class javax.swing.DefaultRowSorter
DefaultRowSorter.ModelWrapper<M,
I> Nested classes/interfaces declared in class javax.swing.RowSorter
RowSorter.SortKey
-
Constructor Summary
ConstructorsConstructorDescription创建一个使用空模型的TableRowSorter
。TableRowSorter
(M model) 使用model
作为底层TableModel
创建一个TableRowSorter
。 -
Method Summary
Modifier and TypeMethodDescriptionComparator
<?> getComparator
(int column) 返回指定列的Comparator
。返回负责将模型值转换为字符串的对象。void
设置用作此TableRowSorter
底层模型的TableModel
。void
setStringConverter
(TableStringConverter stringConverter) 设置负责将模型值转换为字符串的对象。protected boolean
useToString
(int column) 返回在排序时是否将值转换为字符串进行比较。Methods declared in class javax.swing.DefaultRowSorter
allRowsChanged, convertRowIndexToModel, convertRowIndexToView, getMaxSortKeys, getModel, getModelRowCount, getModelWrapper, getRowFilter, getSortKeys, getSortsOnUpdates, getViewRowCount, isSortable, modelStructureChanged, rowsDeleted, rowsInserted, rowsUpdated, rowsUpdated, setComparator, setMaxSortKeys, setModelWrapper, setRowFilter, setSortable, setSortKeys, setSortsOnUpdates, sort, toggleSortOrder
Methods declared in class javax.swing.RowSorter
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener
-
Constructor Details
-
TableRowSorter
public TableRowSorter()创建一个使用空模型的TableRowSorter
。 -
TableRowSorter
使用model
作为底层TableModel
创建一个TableRowSorter
。- 参数:
-
model
- 要使用的底层TableModel
,null
被视为空模型
-
-
Method Details
-
setModel
设置用作此TableRowSorter
底层模型的TableModel
。可以使用null
来设置为空模型。- 参数:
-
model
- 要使用的底层模型,或null
-
setStringConverter
设置负责将模型值转换为字符串的对象。如果非null
,则用于将没有注册Comparator
的任何对象值转换为字符串。- 参数:
-
stringConverter
- 负责将模型值转换为字符串的对象
-
getStringConverter
返回负责将模型值转换为字符串的对象。- 返回:
- 负责将值转换为字符串的对象。
-
getComparator
返回指定列的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
无效
-