【问题标题】:JXTable listen to sort and sort a similar table the same wayJXTable 监听排序和排序相似的表的方式相同
【发布时间】:2011-12-14 22:11:52
【问题描述】:

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

【问题讨论】:

    标签: java swing sorting swingx jxtable


    【解决方案1】:

    您可以定义一个中介类,该类引用每个JTableRowSorter 并将其自身注册为每个排序器的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);
            }
          }
        }
      }
    

    【讨论】:

    • 问题是该表似乎没有任何行排序器。甚至“sortManager”也是空的。但是,当我单击列标题时,排序工作。
    • 我认为那是因为它是一个 JXTable。我以为排序是由 Table 处理的,但现在我不确定了。
    • 啊抱歉 - 没注意到它是 JXTable。如果您使用的是 JDK 1.6,我建议您迁移到 JTable,它可以为您提供更高性能的排序。
    【解决方案2】:

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

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

    【讨论】:

    • 在某些情况下,保持两个表以相同的方式排序很重要;例如,我在构建由左右 JTable 组成的“差异”视图时使用了这种方法,其中滚动条和排序顺序必须保持同步。
    • 当然,有时这很有用。但从用户体验的角度来看,大多数时候这是一个非常糟糕的主意。它违反了“最小惊讶原则”。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2015-05-16
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2015-01-13
    相关资源
    最近更新 更多