java.lang.Object javax.swing.RowSorter<M> javax.swing.DefaultRowSorter<M,Integer> javax.swing.table.TableRowSorter<M>
M
- 模型的类型,必须为
TableModel
的一个实现
public class TableRowSorter<M extends TableModel>
RowSorter
的一个实现,它使用 TableModel
提供排序和过滤操作。下面的例子显示了向 JTable
添加排序操作:
TableModel myModel = createMyTableModel(); JTable table = new JTable(myModel); table.setRowSorter(new TableRowSorter(myModel));此类将完成所有连线操作(wiring),从而当用户做出适当的行为(比如单击列标题)时,表将进行直观的排序。
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
。这将明显增强此类的性能。
JTable
,
RowFilter
,
DefaultTableModel
,
Collator
,
Comparator
嵌套类摘要 |
---|
从类 javax.swing.DefaultRowSorter 继承的嵌套类/接口 |
---|
DefaultRowSorter.ModelWrapper<M,I> |
从类 javax.swing.RowSorter 继承的嵌套类/接口 |
---|
RowSorter.SortKey |
构造方法摘要 | |
---|---|
TableRowSorter() 使用空模型创建一个 TableRowSorter 。 |
|
TableRowSorter(M model) 使用 model 作为底层 TableModel 创建一个 TableRowSorter 。 |
方法摘要 | |
---|---|
Comparator<?> |
getComparator(int column) 返回指定列的 Comparator 。 |
TableStringConverter |
getStringConverter() 返回负责将值从模型转换为字符串的对象。 |
void |
setModel(M model) 将 TableModel 设置为此 TableRowSorter 要使用的底层模型。 |
void |
setStringConverter(TableStringConverter stringConverter) 设置负责将值从模型转换为字符串的对象。 |
protected boolean |
useToString(int column) 返回排序过程中进行比较之前是否要将值转换为字符串。 |
从类 javax.swing.RowSorter 继承的方法 |
---|
addRowSorterListener, fireRowSorterChanged, fireSortOrderChanged, removeRowSorterListener |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
public TableRowSorter()
TableRowSorter
。
public TableRowSorter(M model)
model
作为底层
TableModel
创建一个
TableRowSorter
。
model
- 要使用的底层
TableModel
,
null
被视为空模型。
方法详细信息 |
---|
public void setModel(M model)
TableModel
设置为此
TableRowSorter
要使用的底层模型。可以用
null
值设置空模型。
model
- 要使用的底层模型,或者
null
public void setStringConverter(TableStringConverter stringConverter)
null
,则此方法用于将所有不具有已注册
Comparator
的对象值转换为字符串。
stringConverter
- 负责将值从模型转换为字符串的对象
public TableStringConverter getStringConverter()
public Comparator<?> getComparator(int column)
Comparator
。如果没有使用
setComparator
方法指定
Comparator
,那么将基于指定列的列类(
TableModel.getColumnClass
)返回
Comparator
。如果列类为
String
,则返回
Collator.getInstance
。如果列类实现
Comparable
,则返回调用
compareTo
方法的私有
Comparator
。否则,返回
Collator.getInstance
。
DefaultRowSorter<M extends TableModel,Integer>
中的
getComparator
column
- 要获取
Comparator
的列,就底层模型而言
Comparator
IndexOutOfBoundsException
- 如果
column
超出底层模型的范围
protected boolean useToString(int column)
ModelWrapper.getStringValueAt
;否则,将使用
ModelWrapper.getValueAt
。由子类(比如
TableRowSorter
)决定是否在其
ModelWrapper
实现中遵守此值。
DefaultRowSorter<M extends TableModel,Integer>
中的
useToString
column
- 要测试的列的索引,就底层模型而言
IndexOutOfBoundsException
- 如果
column
无效