Я знаю, что с помощью JTable
столбец сортируется, когда мы нажимаем на заголовок столбца, но я хочу, чтобы, когда я щелкаю правой кнопкой мыши по имени столбца, должно отображаться имя функции «сортировка». Любое предложение сделать это?
Как добавить в jTable функцию, которая сортирует столбец?
Ответы (2)
Начните с добавления MouseListener
в таблицу. См. раздел как написать прослушиватели мыши.
Вам потребуется преобразовать точку щелчка в столбец, см. JTable#columnAtPoint
.
Затем вам нужно будет обновить SortKey
для таблицы. Ознакомьтесь с примером Sort and Filtering.
Если я вас правильно понял, вы хотите выполнить сортировку по какому-то явному действию (запускается, например, во всплывающем окне) вместо обычного щелчка левой кнопкой мыши.
Если это так, сложная часть состоит в том, чтобы заставить делегата пользовательского интерфейса ничего не делать. Есть два варианта:
- подключиться к прослушивателю мыши по умолчанию, установленному делегатом пользовательского интерфейса, как описано в недавнем 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 вам придется написать еще несколько строк, но основы те же: установите хитрый сортировщик и используйте его пользовательскую сортировку с переключением для действительно сортировать везде, где нужно, фи в мышином прослушивателе.