Как добавить в jTable функцию, которая сортирует столбец?

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


person Saumil    schedule 27.08.2013    source источник
comment
зачем усложнять жизнь пользователям?   -  person kleopatra    schedule 27.08.2013
comment
@kleopatra на самом деле это то, что требует клиент, потому что он не хочет, чтобы столбец был случайно отсортирован при нажатии на заголовок столбца. :)   -  person Saumil    schedule 27.08.2013


Ответы (2)


Начните с добавления MouseListener в таблицу. См. раздел как написать прослушиватели мыши.

Вам потребуется преобразовать точку щелчка в столбец, см. JTable#columnAtPoint.

Затем вам нужно будет обновить SortKey для таблицы. Ознакомьтесь с примером Sort and Filtering.

person MadProgrammer    schedule 27.08.2013

Если я вас правильно понял, вы хотите выполнить сортировку по какому-то явному действию (запускается, например, во всплывающем окне) вместо обычного щелчка левой кнопкой мыши.

Если это так, сложная часть состоит в том, чтобы заставить делегата пользовательского интерфейса ничего не делать. Есть два варианта:

  • подключиться к прослушивателю мыши по умолчанию, установленному делегатом пользовательского интерфейса, как описано в недавнем QA
  • пусть пользовательский интерфейс делает свое дело, но обманываете его реализацией сортировщика, которая не следует правилам (осторожно: это так же грязно, как и первый подход!)

Неправильный сортировщик:

public class MyTableRowSorter extends TableRowSorter {

    public MyTableRowSorter(TableModel model) {
        super(model);
    }

    /**
     * Implemented to do nothing to fool tableHeader internals.
     */
    @Override
    public void toggleSortOrder(int column) {
    }

    /**
     * The method that really toggles, called from custom code.
     * 
     * @param column
     */
    public void realToggleSortOrder(int column) {
        super.toggleSortOrder(column);
    }

}

// Применение

final JTable table = new JXTable(new AncientSwingTeam());
table.setRowSorter(new MyTableRowSorter(table.getModel()));
Action toggle = new AbstractAction("toggleSort") {

    @Override
    public void actionPerformed(ActionEvent e) {
        JXTableHeader header = SwingXUtilities.getAncestor(
                JXTableHeader.class, (Component) e.getSource());
        Point trigger = header.getPopupTriggerLocation();
        int column = trigger != null ? header.columnAtPoint(trigger) : -1;
        if (column < 0) return;
        int modelColumn = header.getTable().convertColumnIndexToModel(column);
        ((MyTableRowSorter) header.getTable().getRowSorter())
           .realToggleSortOrder(modelColumn);
    }
};
JPopupMenu menu = new JPopupMenu();
menu.add(toggle);
table.getTableHeader().setComponentPopupMenu(menu);

Да, не мог удержаться от того, чтобы добавить немного API SwingX, мне лень :-) С простым Swing вам придется написать еще несколько строк, но основы те же: установите хитрый сортировщик и используйте его пользовательскую сортировку с переключением для действительно сортировать везде, где нужно, фи в мышином прослушивателе.

person kleopatra    schedule 28.08.2013