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

Joo*_*ing 4 java sorting swing jtable

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

kle*_*tra 17

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

UNSORTED - > ASCENDING - > DESCENDING - > ASCENDING -

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

UNSORTED - > ASCENDING - > DESCENDING - UNSORTED - > ASCENDING -

要走的路是子类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);
    }
Run Code Online (Sandbox Code Playgroud)

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

 table.setSortOrderCycle(ASCENDING, DESCENDING, UNSORTED);
Run Code Online (Sandbox Code Playgroud)

干杯珍妮特


tra*_*god 5

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

RowSorter rs = table.getRowSorter();
rs.setSortKeys(null);
Run Code Online (Sandbox Code Playgroud)

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


Kor*_*ell 5

此代码实现循环 ASCENDING->DESCENDING->UNSORTED->... 而不覆盖 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);
    }
});
Run Code Online (Sandbox Code Playgroud)