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实际上这是客户的要求,因为他不希望在单击列标题时意外地对列进行排序。:)