maloney
maloney

Reputation: 1653

Disable Column Header sorting on a JTable

Is it possible to disable manual sorting on a JTable after adding a sorter? So I have a JTable that has the following sorter attached to it (basically sorts by column 3 when the table is initialised):

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);

This works fine, however the user is still able to click on the column headers in the table and sort by any of the columns, which I want to disable. Is this possible?

Upvotes: 6

Views: 16084

Answers (4)

neflow
neflow

Reputation: 76

In case your table derived from com.jidesoft.grid.TreeTable (JIDE), you can do this:

 class MyTreeTable extends TreeTable
    {
        public MyTreeTable()
        {
            getSortableTableModel().setColumnSortable(0, false);
        }
    }

Note that getSortableTableModel is protected so it must be called from within a TreeTable method (constructor in this example).

Upvotes: 1

Sandip Ghosh
Sandip Ghosh

Reputation: 719

I ran into the same problem recently, and found the perfect solution to this problem. The TableHeader can simply be disabled.

jTable.getTableHeader().setEnabled(false);

This way, the sorter works perfectly on any of the columns, but manual sorting is prevented by click on the Column Headers.

Hope this helps the future users who might want to have a look at it.

Upvotes: 6

Rahul
Rahul

Reputation: 3509

You can use the setSortable method of TableRowSorter as below:

sorter.setSortable(0, false); 

to make column 0 non-sortable. You can apply it on the column according to your requirement.

Upvotes: 17

mostar
mostar

Reputation: 4821

Alternatively, you can set your sortable and non-sortable columns like this:

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);

Upvotes: 6

Related Questions