如何在jTable中添加对列进行排序的函数



我知道,通过使用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中。

相关内容

  • 没有找到相关文章

最新更新