Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jTable中添加对列进行排序的函数?_Java_Swing_Jtable_Jtableheader_Rowsorter - Fatal编程技术网

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

Java 如何在jTable中添加对列进行排序的函数?,java,swing,jtable,jtableheader,rowsorter,Java,Swing,Jtable,Jtableheader,Rowsorter,我知道,通过使用JTable在单击列标题时会对列进行排序,但我想要的是,当我右键单击列名时,应该显示函数名“sort”。有什么建议吗?首先在表中添加一个MouseListener。看 您需要将单击点转换为柱,请参见 然后需要更新表的SortKey。查看一个示例首先在表中添加一个鼠标侦听器。看 您需要将单击点转换为柱,请参见 然后需要更新表的SortKey。查看一个示例如果我理解正确,您希望通过一些明确的操作(在弹出窗口中触发f.I.)而不是通过正常的左键单击进行排序 如果是这样,棘手的部分是强制

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

首先在表中添加一个
MouseListener
。看

您需要将单击点转换为柱,请参见


然后需要更新表的
SortKey
。查看一个示例

首先在表中添加一个
鼠标侦听器
。看

您需要将单击点转换为柱,请参见


然后需要更新表的
SortKey
。查看一个示例

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

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

  • 钩住ui委托安装的默认鼠标侦听器,如下所示
  • 让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);
final JTable table=newjxtable(new-acientswingteam());
table.setRowSorter(新的MyTableRowSorter(table.getModel());
动作切换=新的抽象动作(“切换排序”){
@凌驾
已执行的公共无效操作(操作事件e){
JXTableHeader header=SwingXUtilities.getAncenter(
JXTableHeader.class,(组件)e.getSource();
点触发器=header.getPopupTriggerLocation();
int column=trigger!=null?标题。columnAtPoint(触发器):-1;
if(列<0)返回;
int modelColumn=header.getTable().convertColumnIndexToModel(列);
((MyTableRowSorter)头.getTable().getRowSorter())
.realToggleSortOrder(modelColumn);
}
};
JPopupMenu=newjpopupmenu();
菜单。添加(切换);
table.getTableHeader().setComponentPopupMenu(菜单);

是的,情不自禁地加入了一些SwingX api,lazy me:-)使用普通Swing,您将不得不多写几行,但基本原理是一样的:安装诡计多端的排序器,并使用其自定义切换排序功能,在鼠标侦听器中根据需要进行真正的排序。

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

如果是这样,棘手的部分是强制ui委托什么也不做。有两个选项:

  • 钩住ui委托安装的默认鼠标侦听器,如下所示
  • 让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);
final JTable table=newjxtable(new-acientswingteam());
table.setRowSorter(新的MyTableRowSorter(table.getModel());
动作切换=新的抽象动作(“切换排序”){
@凌驾
已执行的公共无效操作(操作事件e){
JXTableHeader header=SwingXUtilities.getAncenter(
JXTableHeader.class,(组件)e.getSource();
点触发器=header.getPopupTriggerLocation();
int column=trigger!=null?标题。columnAtPoint(触发器):-1;
if(列<0)返回;
int modelColumn=header.getTable().convertColumnIndexToModel(列);
((MyTableRowSorter)头.getTable().getRowSorter())
.realToggleSortOrder(modelColumn);
}
};
JPopupMenu=newjpopupmenu();
菜单。添加(切换);
table.getTableHeader().setComponentPopupMenu(菜单);

是的,情不自禁地加入了一些SwingX api,lazy me:-)使用普通Swing,您将不得不编写更多的行,但基本原理是一样的:安装诡计多端的排序器,并使用其自定义切换排序来真正排序需要的地方,f.i.。

为什么要让用户感到困难?@kleopatra实际上这是客户的要求,因为他不希望在单击列标题时意外地对列进行排序。:)为什么要让用户感到困难?@kleopatra实际上这是客户的要求,因为他不希望在单击列标题时意外地对列进行排序。:)