【发布时间】:2011-12-14 22:11:52
【问题描述】:
我有许多 JXTable,它们都有相同的列(但数据不同)。您可以通过单击其中一列的标题对数据进行排序。我现在想要的是,单击其中一个表的标题时,其他表的排序方式相同。
【问题讨论】:
标签: java swing sorting swingx jxtable
我有许多 JXTable,它们都有相同的列(但数据不同)。您可以通过单击其中一列的标题对数据进行排序。我现在想要的是,单击其中一个表的标题时,其他表的排序方式相同。
【问题讨论】:
标签: java swing sorting swingx jxtable
您可以定义一个中介类,该类引用每个JTable 的RowSorter 并将其自身注册为每个排序器的RowSorterListener。当给定的排序器发生变化时,您可以使用getSortKets() 检索其当前排序键列表,并使用setSortKeys(List<? extends SortKey>) 将它们传递给其他所有排序器。
示例
首先我们定义中介类:
public class SortMediator implements RowSorterListener {
private final List<RowSorter> sorters;
private boolean changing;
public void addRowSorter(RowSorter sorter) {
this.sorters.add(sorter);
}
public void sorterChanged(RowSorterEvent e) {
...
}
}
现在我们实现sorterChanged(RowSorterEvent e) 来响应给定的排序器事件:
public void sorterChanged(RowSorterEvent e) {
// The changing flag prevents an infinite loop after responding to the inital
// sort event.
if (!changing) {
changing = true;
RowSorter changedSorter = e.getSource();
List<? extends SortKey> keys = changedSorter.getKeys();
for (RowSorter sorter : sorters) {
if (sorter != changedSorter) {
// Install new sort keys, which will cause the sorter to re-sort.
// The changing flag will prevent the mediator from reacting to this.
sorter.setSortKeys(keys);
}
}
}
}
【讨论】:
我不会这样做,因为它会剥夺用户的控制权:他/她可能希望对表格进行不同的排序,以比较不同的数据。
相反,在“查看”菜单中添加“排序依据”选项。更改此选项将对所有表进行排序,但除非用户想要对特定表进行排序,否则不要理会它们。
【讨论】: