在JTable上禁用列标题排序

6

在添加排序器之后,是否有可能禁用JTable上的手动排序?所以我有一个JTable,它附有以下的排序器(基本上当表格初始化时按列3排序):

JTable jTable = new JTable();
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable.getModel());
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(3, SortOrder.DESCENDING));
sorter.setSortKeys(sortKeys); 
jTable.setRowSorter(sorter);

这个功能很好,但是用户仍然可以点击表格中的列标题并按任何一列进行排序,我想禁用此功能。这有可能吗?


1
你可能会喜欢查看@mkorbel在这个类似问题中的建议。 - MadProgrammer
阅读默认/行排序器的API文档可能会有所帮助 :-) - kleopatra
4个回答

17

您可以如下使用TableRowSortersetSortable方法:

sorter.setSortable(0, false); 

要使第0列不可排序。您可以根据需求在该列上应用它。


1
RowSorter#setSortable(int, boolean) 函数不存在。你可能在引用其他具有该函数的类,但是你的回答没有涉及到这一点,这使得它成为一个不好的回答。请更新。 - searchengine27
从技术上讲,更准确的说法是 DefaultRowSorter#setSortable(int, boolean),但由于 TableRowSorter 扩展了 DefaultRowSorter,因此这个答案仍然有效。 - searchengine27
((DefaultRowSorter) jTable.getRowSorter()).setSortable(0, false); would prevent column 0 from being sorted. As stated on the other comments setSortable(int,bool) belongs to DefaultRowSorter - LeedMx

6

或者,您可以像这样设置可排序和不可排序的列:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()) {
    @Override
    public boolean isSortable(int column) {
        if(column < 2)
            return true;
        else 
            return false;
    };
};
table.setRowSorter(sorter);

6

最近我也遇到了同样的问题,并找到了完美的解决方案。只需禁用TableHeader即可。

jTable.getTableHeader().setEnabled(false);

这样,排序器可以在任何列上完美工作,但通过单击列标题来进行手动排序是被禁止的。
希望这能帮助未来可能想查看它的用户。

1
如果您的表格是从com.jidesoft.grid.TreeTable (JIDE)派生的,您可以这样做:
 class MyTreeTable extends TreeTable
    {
        public MyTreeTable()
        {
            getSortableTableModel().setColumnSortable(0, false);
        }
    }

请注意,getSortableTableModel是受保护的方法,因此必须从TreeTable方法内部调用它(在本例中为构造函数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接