4

我有许多 JXTable,它们都有相同的列(但数据不同)。您可以通过单击其中一列的标题对数据进行排序。我现在想要的是,单击其中一个表的标题时,其他表的排序方式相同。

4

2 回答 2

4

您可以定义一个调解器类,该类引用每个JTable'sRowSorter并将其自身注册为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);
        }
      }
    }
  }
于 2010-01-14T14:37:16.380 回答
0

我不会那样做,因为它会夺走用户的控制权:他/她可能希望对表格进行不同的排序,以比较不同的数据。

相反,在“查看”菜单中添加“排序依据”选项。更改此选项将对所有表进行排序,但除非用户想要对特定表进行排序,否则不要理会它们。

于 2010-01-14T14:40:20.463 回答