我知道,通过使用JTable
,当我们单击列标题时,列会被排序,但我想要的是,当我右键单击列名时,应该显示函数名"sort"。有什么建议吗?
首先向表中添加一个MouseListener
。请参阅如何编写鼠标侦听器
您需要将单击点转换为一列,请参阅JTable#columnAtPoint
。
然后,您需要更新该表的SortKey
。查看示例的排序和筛选
如果我理解正确,您希望通过一些显式操作(在弹出窗口中触发f.I.)进行排序,而不是通过正常的左键点击进行排序。
如果是这样,那么棘手的部分就是强制ui代理什么都不做。有两种选择:
- 挂钩到ui委托安装的默认鼠标侦听器,如最近的QA中所述
- 让ui做自己的事情,但通过不遵守规则的分类器实现来欺骗它(小心:这和第一种方法一样肮脏!)
错误的分拣机:
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 api,懒惰的我:-)使用普通的Swing,你必须多写几行,但基本原理是一样的:安装tricksy分类器,并使用其自定义的toggle排序来在需要的地方进行真正的排序,例如在mouseListener中。