2013-08-27 2 views
0

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

+0

Почему для вас затрудняются? – kleopatra

+0

@ kleopatra на самом деле это то, что требует клиент, потому что он не хочет, чтобы столбец случайно сортировался при щелчке заголовка столбца. :) – John11

ответ

2

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

Если это так, сложной частью является заставить ui-делегат ничего не делать. Есть два варианта:

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

ИСУ-Behaving сортировщик:

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); 

Да, не удержалось бросать в некотором SwingX апи, ленивый меня :-) С простыми Качелями, вам придется написать несколько строк больше, но основы те же: установить tricksy сортировать и использовать свой обычай сортировать сортировку до действительно сортировать все необходимое, fi в mouseListener.

Смежные вопросы