代码之家  ›  专栏  ›  技术社区  ›  Fortega

jxtable侦听以相同的方式对类似的表进行排序

  •  4
  • Fortega  · 技术社区  · 15 年前

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

    2 回复  |  直到 13 年前
        1
  •  4
  •   Adamski    15 年前

    您可以定义一个中介类,该类引用 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);
            }
          }
        }
      }
    
        2
  •  0
  •   kdgregory    15 年前

    我不会这样做,因为这会剥夺用户的控制权:S/他可能希望表的排序不同,以便比较不同的数据块。

    相反,在视图菜单中添加一个“排序依据”选项。更改此选项将对所有表进行排序,但除非用户希望对特定表进行排序,否则不要对它们进行排序。

    推荐文章