0

我知道JTable当我们单击列标题时,通过使用列进行排序,但我想要的是,当我右键单击列名时,应该显示一个函数名“排序”。有什么建议吗?

4

2 回答 2

3

首先将 a 添加MouseListener到表中。请参阅如何编写鼠标侦听器

您需要将点击点转换为列,请参阅JTable#columnAtPoint

然后,您将需要更新SortKey表。查看排序和过滤的示例

于 2013-08-27T07:40:36.560 回答
2

如果我对您的理解正确,您希望按一些显式操作(在弹出窗口中触发 fi)而不是按正常的左键单击进行排序。

如果是这样,棘手的部分是强制 ui-delegate 什么都不做。有两种选择:

  • 挂钩到由 ui 委托安装的默认鼠标侦听器,如最近的 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);

是的,忍不住扔了一些 SwingX api,懒我 :-) 使用普通的 Swing,你将不得不多写几行,但基础是一样的:安装棘手的排序器并使用它的自定义切换排序来真正排序任何需要的地方,都可以在 mouseListener 中使用。

于 2013-08-28T08:04:33.910 回答