我知道通过使用JTable
,当我们点击列标题时,列会被排序,但我想要的是,当我右键单击列名时,应该显示一个函数名'sort' 。这样做有什么建议吗?
答案 0 :(得分:3)
首先在表格中添加MouseListener
。见How to write mouse listeners
您需要将点击点转换为列,请参阅JTable#columnAtPoint
。
然后,您需要更新表格的SortKey
。查看Sorting and Filtering以获取示例
答案 1 :(得分:2)
如果我理解正确,您希望通过正常的左键单击显式操作(在弹出窗口中触发f.i.)而不是进行排序。
如果是这样,棘手的部分是迫使ui-delegate什么也不做。有两种选择:
行为不端的分拣机:
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,你必须多写几行但是基础是相同的:安装狡猾的分拣机并使用它的自定义切换排序到真正按需要排序,fi在mouseListener中。