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

时间:2013-08-27 07:37:25

标签: java swing jtable jtableheader rowsorter

我知道通过使用JTable,当我们点击列标题时,列会被排序,但我想要的是,当我右键单击列名时,应该显示一个函数名'sort' 。这样做有什么建议吗?

2 个答案:

答案 0 :(得分:3)

首先在表格中添加MouseListener。见How to write mouse listeners

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

然后,您需要更新表格的SortKey。查看Sorting and Filtering以获取示例

答案 1 :(得分:2)

如果我理解正确,您希望通过正常的左键单击显式操作(在弹出窗口中触发f.i.)而不是进行排序。

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

  • 挂钩到ui委托安装的默认鼠标侦听器,为described in a recent 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,你必须多写几行但是基础是相同的:安装狡猾的分拣机并使用它的自定义切换排序到真正按需要排序,fi在mouseListener中。