如何使用JTable的行分类器恢复原始行顺序?

时间:2011-03-29 19:40:33

标签: java swing sorting jtable

我已经使用setAutoCreateRowSorter方法在JTable中启用了排序。鼠标单击列标题将在升序和降序之间切换,但我想在升序,降序和原始(未排序)行顺序之间切换。任何提示如何实现这一目标?

6 个答案:

答案 0 :(得分:15)

鼠标单击到更改排序状态的映射在BasicTableHeaderUI中实现,并且仅通过RowSorter的toggleSortOrder(columnIndex)发生。它的默认行为是切换

UNSORTED - > ASCENDING - > DESCENDING - >提升 -

也就是说,没办法回到UNSORTED。如果要求只是将圆圈扩大为:

UNSORTED - > ASCENDING - > DESCENDING - UNSORTED - >提升 -

要走的路是继承TableRowSorter并相应地覆盖它的toggleSortOrder

    /** 
     * @inherited <p>
     */
    @Override
    public void toggleSortOrder(int column) {
        List<? extends SortKey> sortKeys = getSortKeys();
        if (sortKeys.size() > 0) {
            if (sortKeys.get(0).getSortOrder() == SortOrder.DESCENDING) {
                setSortKeys(null);
                return;
            }
        }
        super.toggleSortOrder(column);
    }

注意:这有点简化,因为它没有考虑n-ary排序列,请参阅SwingX DefaultSortController获取完整版本。或者使用SwingX开始,它的JXTable有api配置排序周期,如

 table.setSortOrderCycle(ASCENDING, DESCENDING, UNSORTED);

干杯 珍

答案 1 :(得分:4)

此代码实现了循环ASCENDING-&gt; DESCENDING-&gt; UNSORTED-&gt; ...而不覆盖TableRowSorter:

TableRowSorter sorter = new TableRowSorter(getModel());
setRowSorter(sorter);
// Remove default sort MouseListener
for (MouseListener mouseListener : getTableHeader().getMouseListeners()) {
    if (mouseListener instanceof javax.swing.plaf.basic.BasicTableHeaderUI.MouseInputHandler) {
        getTableHeader().removeMouseListener(mouseListener);
    }
}
// Add MouseListener for onClick event
getTableHeader().addMouseListener(new MouseAdapter() {
    private SortOrder currentOrder = SortOrder.UNSORTED;

    @Override
    public void mouseClicked(MouseEvent e) {
        int column = getTableHeader().columnAtPoint(e.getPoint());
        RowSorter sorter = getRowSorter();
        List sortKeys = new ArrayList();
        switch (currentOrder) {
            case UNSORTED:
                sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING));
                break;
            case ASCENDING:
                sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING));
                break;
            case DESCENDING:
                sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED));
                break;
        }
        sorter.setSortKeys(sortKeys);
    }
});

答案 2 :(得分:3)

如果您使用的是DefaultRowSorter:“空sortKeys列表表示该视图应该是未排序的,与模型相同。”

RowSorter rs = table.getRowSorter();
rs.setSortKeys(null);

附录:请注意,“null是在setSortKeys()中指定空列表的简写。

答案 3 :(得分:2)

Kornell的回答对我很有用(谢谢!)

我做了这些改变,其他人可能会觉得有帮助:

  1. 将列从视图转换为模型坐标。这是原版中的一个错误。
  2. 省略删除其他鼠标侦听器,因为这样做会禁用列拖动和调整大小。
  3. 过滤除了左键点击之外的任何内容
  4. 每当列更改时,重新初始化排序顺序。用户体验通过这种方式更加直观,因为您可以连续点击不同的列并每次都按升序排列。

    TableRowSorter sorter = new TableRowSorter(getModel());
    setRowSorter(sorter);
    getTableHeader().addMouseListener(new MouseAdapter() {
        private SortOrder   currentOrder    = SortOrder.UNSORTED;
        private int         lastCol         = -1;
    
        @Override
        public void mouseClicked(MouseEvent e) {
            int column = getTableHeader().columnAtPoint(e.getPoint());
            column = convertColumnIndexToModel(column);
            if (column != lastCol) {
                currentOrder = SortOrder.UNSORTED;
                lastCol = column;
            }
            RowSorter<?> sorter = getRowSorter();
            List<SortKey> sortKeys = new ArrayList<SortKey>();
            if (e.getButton() == MouseEvent.BUTTON1) {
                switch (currentOrder) {
                    case UNSORTED:
                        sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING));
                    break;
                    case ASCENDING:
                        sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING));
                    break;
                    case DESCENDING:
                        sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED));
                    break;
                }
                sorter.setSortKeys(sortKeys);
            }
        }
    });
    

答案 4 :(得分:0)

由于内置排序机制只为您提供升序或降序,如果您在JTable附近提供外部重载JButton,您可以将相同的模型设置回原来的状态当您在任何排序活动发生之前第一次显示表格时。

答案 5 :(得分:-1)

如果您正在寻找UI方式,请按住Shift键点击列标题即可。这是内置的JTable功能