Как восстановить исходный порядок строк с помощью сортировщика строк JTable? - PullRequest
3 голосов
/ 29 марта 2011

Я включил сортировку в JTable с помощью метода setAutoCreateRowSorter. Щелчки мыши по заголовкам столбцов будут переключаться между возрастающим и нисходящим порядком, но я бы хотел переключить его между восходящим, нисходящим и исходным (несортированным) порядком строк. Любые намеки, как этого добиться?

Ответы [ 6 ]

16 голосов
/ 30 марта 2011

Отображение щелчка мышью на изменение состояния сортировки реализовано в BasicTableHeaderUI и происходит исключительно через toggleSortOrder (columnIndex) RowSorter. Поведение по умолчанию - переключать

НЕПРАВИЛЬНО -> Восходящий -> По убыванию -> Восходящий -

то есть, нет пути назад в несортированное. Если необходимо просто расширить круг на:

НЕПРАВИЛЬНО -> Восходящее -> По убыванию - Несортировано -> Восходящее -

путь состоит в том, чтобы создать подкласс 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-ые отсортированные столбцы, для полной версии см. SwingX DefaultSortController. Или используйте SwingX для начала, его JXTable имеет api для настройки цикла сортировки, например

 table.setSortOrderCycle(ASCENDING, DESCENDING, UNSORTED);

Приветствие Жанетт

4 голосов
/ 29 мая 2014

Этот код реализует цикл 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);
    }
});
3 голосов
/ 30 марта 2011

Если вы используете DefaultRowSorter: «Пустой список sortKeys указывает на то, что представление должно [быть] не отсортировано, так же, как и модель.»

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

Добавление: обратите внимание, что «null является сокращением для указания пустого списка» в setSortKeys().

2 голосов
/ 13 марта 2015

Ответ Корнелла отлично работает для меня (спасибо!)

Я внес эти изменения, которые другие могут найти полезными:

  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);
            }
        }
    });
    
0 голосов
/ 30 марта 2011

Если вы ищете способ сделать это в пользовательском интерфейсе - сделайте это, нажав Shift-на заголовке столбца.Это встроенная функциональность JTable

0 голосов
/ 30 марта 2011

Поскольку встроенный механизм сортировки дает вам только восходящий или нисходящий порядок, вы можете вернуться в исходное состояние, если вы предоставите внешнюю перезагрузку-JButton, где-то рядом с JTable, которая просто устанавливает ту же модель на то, что вы имели как вы отображали таблицу в первый раз, до того, как произойдет сортировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...